Non userei un cursore esplicito per farlo. Steve F. non consiglia più alle persone di utilizzare cursori espliciti quando è possibile utilizzare un cursore implicito.
Il metodo con count(*)
non è sicuro. Se un'altra sessione elimina la riga che ha soddisfatto la condizione dopo la riga con count(*)
, e prima della riga con select ... into
, il codice genererà un'eccezione che non verrà gestita.
La seconda versione del post originale non presenta questo problema ed è generalmente preferita.
Detto questo, c'è un sovraccarico minore utilizzando l'eccezione e, se sei sicuro al 100% che i dati non cambieranno, puoi utilizzare il count(*)
, ma lo sconsiglio.
Ho eseguito questi benchmark su Oracle 10.2.0.1 su Windows a 32 bit . Sto solo guardando il tempo trascorso. Esistono altri cablaggi di test che possono fornire maggiori dettagli (come i conteggi dei latch e la memoria utilizzata).
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;
/