Saya tidak akan menggunakan kursor eksplisit untuk melakukan ini. Steve F. tidak lagi menyarankan orang untuk menggunakan kursor eksplisit ketika kursor implisit dapat digunakan.
Metode dengan count(*)
tidak aman. Jika sesi lain menghapus baris yang memenuhi kondisi setelah baris dengan count(*)
, dan sebelum baris dengan select ... into
, kode akan mengeluarkan pengecualian yang tidak akan ditangani.
Versi kedua dari kiriman asli tidak memiliki masalah ini, dan umumnya lebih disukai.
Yang mengatakan, ada overhead kecil menggunakan pengecualian, dan jika Anda 100% yakin data tidak akan berubah, Anda dapat menggunakan count(*)
, tapi saya sarankan untuk tidak melakukannya.
Saya menjalankan tolok ukur ini di Oracle 10.2.0.1 pada Windows 32 bit . Saya hanya melihat waktu yang telah berlalu. Ada rangkaian uji lain yang dapat memberikan detail lebih lanjut (seperti jumlah kait dan memori yang digunakan).
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;
/