Buat tabel eksternal pada file CSV Anda. Ini adalah hal-hal yang sangat rapi yang memungkinkan kita untuk menanyakan isi file OS dalam SQL. Cari tahu lebih lanjut .
Maka itu masalah sederhana untuk mengeluarkan kueri:
select csv.id
, case ( when tgt.id is null then 'invalid' else 'valid') end as valid_id
from your_external_tab csv
left join target_table tgt on (csv.id = tgt.id)
Kinerja adalah masalah konteks. Dalam hal ini tergantung pada seberapa sering data dalam CSV berubah dan seberapa sering kita perlu menanyakannya. Jika file diproduksi sekali sehari dan kita hanya perlu memeriksa nilainya setelah dikirimkan maka tabel eksternal adalah solusi yang paling efisien. Tetapi jika kumpulan data ini adalah repositori permanen yang perlu sering ditanyakan maka biaya menulis ke tabel heap jelas dibenarkan.
Bagi saya, file CSV yang terdiri dari banyak ID dan tidak ada yang terdengar seperti data sementara dan sesuai dengan kasus penggunaan untuk tabel eksternal. Tetapi OP mungkin memiliki persyaratan tambahan yang belum mereka sebutkan.
Berikut adalah pendekatan alternatif yang tidak memerlukan pembuatan objek database permanen. Akibatnya itu kurang elegan, dan mungkin akan berkinerja lebih buruk.
Ia membaca file CSV dengan susah payah menggunakan UTL_FILE dan mengisi koleksi berdasarkan SYSTEM.NUMBER_TBL_TYPE, koleksi yang telah ditentukan sebelumnya (tabel bersarang NUMBER) yang harus tersedia di database Oracle Anda.
declare
ids system.number_tbl_type;
fh utl_file.file_handle;
idx pls_integer := 0;
n pls_integer;
begin
fh := utl_file.fopen('your_data_directory', 'your_data.csv', 'r');
begin
utl_file.get_line(fh, n);
loop
idx := idx + 1;
ids.extend();
ids(idx) := n;
utl_file.get_line(fh, n);
end loop;
exception
when no_data_found then
if utl_file.is_open(fh) then
utl_file.fclose(fh);
end if;
when others then
raise;
end;
for id_recs in in ( select csv.column_value
, case ( when tgt.id is null then 'invalid' else 'valid') end as valid_id
from (select * from table(ids)) csv
left join target_table tgt on (csv.column_value = tgt.id)
) loop
dbms_output.put_line '(ID '||id_recs.column_value || ' is '||id_recs.valid_id);
end loop;
end;
Catatan:Saya belum menguji kode ini. Prinsipnya bagus tetapi detailnya mungkin perlu di-debug;)