Jag skulle inte använda en explicit markör för att göra detta. Steve F. råder inte längre människor att använda explicita markörer när en implicit markör kan användas.
Metoden med count(*)
är osäker. Om en annan session tar bort raden som uppfyllde villkoret efter raden med count(*)
, och före raden med select ... into
, kommer koden att skapa ett undantag som inte kommer att hanteras.
Den andra versionen från det ursprungliga inlägget har inte detta problem, och det är i allmänhet att föredra.
Som sagt, det finns en mindre overhead med undantaget, och om du är 100 % säker på att data inte kommer att ändras kan du använda count(*)
, men jag avråder från det.
Jag körde dessa riktmärken på Oracle 10.2.0.1 på 32-bitars Windows . Jag tittar bara på förfluten tid. Det finns andra testselar som kan ge mer detaljer (som t.ex. låstal och använda minne).
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;
/