Byg en ekstern tabel på din CSV-fil. Disse er meget pæne ting, som giver os mulighed for at forespørge på indholdet af en OS-fil i SQL. Få mere at vide .
Så er det et simpelt spørgsmål om at udstede en forespørgsel:
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)
Performance er et spørgsmål om kontekst. I dette tilfælde afhænger det af, hvor ofte dataene i CSV'en ændres, og hvor ofte vi skal forespørge på dem. Hvis filen produceres én gang om dagen, og vi kun skal tjekke værdierne efter at den er leveret, er en ekstern tabel den mest effektive løsning. Men hvis dette datasæt er et permanent lager, som skal forespørges ofte, så er overheaden ved at skrive til en heap-tabel naturligvis berettiget.
For mig lyder en CSV-fil bestående af en masse ID'er og intet andet som forbigående data og passer til brugen af eksterne tabeller. Men OP kan have yderligere krav, som de ikke har nævnt.
Her er en alternativ tilgang, som ikke kræver oprettelse af permanente databaseobjekter. Derfor er den mindre elegant og vil sandsynligvis fungere dårligere.
Den læser CSV-filen møjsommeligt ved hjælp af UTL_FILE og udfylder en samling baseret på SYSTEM.NUMBER_TBL_TYPE, en foruddefineret samling (indlejret tabel med NUMBER), som burde være tilgængelig i din Oracle-database.
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;
Bemærk:Jeg har ikke testet denne kode. Princippet er forsvarligt, men detaljerne skal muligvis fejlfindes;)