Създайте външна таблица върху вашия CSV файл. Това са много спретнати неща, които ни позволяват да правим заявки за съдържанието на OS файл в SQL. Научете повече .
След това е просто да подадете заявка:
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)
Изпълнението е въпрос на контекст. В този случай зависи от това колко често се променят данните в CSV и колко често трябва да го правим заявки. Ако файлът се създава веднъж на ден и ние трябва да проверяваме стойностите само след като бъде доставен, тогава външна таблица е най-ефективното решение. Но ако този набор от данни е постоянно хранилище, което трябва да се запитва често, тогава режийните разходи за запис в таблица с купчини очевидно са оправдани.
За мен CSV файл, състоящ се от куп идентификатори и нищо друго, звучи като преходни данни и отговаря на случая на използване за външни таблици. Но ОП може да има допълнителни изисквания, които те не са споменали.
Ето алтернативен подход, който не изисква създаване на постоянни обекти на база данни. Следователно той е по-малко елегантен и вероятно ще работи по-зле.
Той чете CSV файла усилено, използвайки UTL_FILE и попълва колекция, базирана на SYSTEM.NUMBER_TBL_TYPE, предварително дефинирана колекция (вложена таблица от NUMBER), която трябва да е налична във вашата база данни на Oracle.
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;
Забележка:Не съм тествал този код. Принципът е стабилен, но подробностите може да се нуждаят от отстраняване на грешки;)