Jeg ville ikke bruge en eksplicit markør til at gøre dette. Steve F. råder ikke længere folk til at bruge eksplicitte markører, når en implicit markør kunne bruges.
Metoden med count(*)
er usikker. Hvis en anden session sletter rækken, der opfyldte betingelsen efter linjen med count(*)
, og før linjen med select ... into
, vil koden kaste en undtagelse, som ikke bliver håndteret.
Den anden version fra det originale indlæg har ikke dette problem, og det foretrækkes generelt.
Når det er sagt, er der en mindre overhead ved at bruge undtagelsen, og hvis du er 100 % sikker på, at dataene ikke ændres, kan du bruge count(*)
, men jeg fraråder det.
Jeg kørte disse benchmarks på Oracle 10.2.0.1 på 32 bit Windows . Jeg ser kun på forløbet tid. Der er andre testseler, der kan give flere detaljer (såsom låsetæller og brugt hukommelse).
SQL>create table t (NEEDED_FIELD number, COND number);
SQL>insert into t (NEEDED_FIELD, cond) values (1, 0);
declare
otherVar number;
cnt number;
begin
for i in 1 .. 50000 loop
select count(*) into cnt from t where cond = 1;
if (cnt = 1) then
select NEEDED_FIELD INTO otherVar from t where cond = 1;
else
otherVar := 0;
end if;
end loop;
end;
/
declare
otherVar number;
begin
for i in 1 .. 50000 loop
begin
select NEEDED_FIELD INTO otherVar from t where cond = 1;
exception
when no_data_found then
otherVar := 0;
end;
end loop;
end;
/