Bygg en extern tabell på din CSV-fil. Dessa är mycket snygga saker som gör att vi kan fråga innehållet i en OS-fil i SQL. Läs mer .
Sedan är det en enkel fråga att skicka en fråga:
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)
Prestanda är en fråga om sammanhang. I det här fallet beror det på hur ofta data i CSV:en ändras och hur ofta vi behöver fråga efter dem. Om filen produceras en gång om dagen och vi bara behöver kontrollera värdena efter att den har levererats är en extern tabell den mest effektiva lösningen. Men om denna datamängd är ett permanent arkiv som behöver frågas ofta så är det uppenbarligen berättigat att skriva till en heaptabell.
För mig låter en CSV-fil som består av ett gäng ID:n och inget annat som övergående data och passar till användningsfallet för externa tabeller. Men OP kan ha ytterligare krav som de inte har nämnt.
Här är ett alternativt tillvägagångssätt som inte kräver att du skapar några permanenta databasobjekt. Följaktligen är den mindre elegant och kommer förmodligen att prestera sämre.
Den läser CSV-filen mödosamt med UTL_FILE och fyller i en samling baserad på SYSTEM.NUMBER_TBL_TYPE, en fördefinierad samling (kapslad tabell med NUMBER) som bör vara tillgänglig i din Oracle-databas.
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;
Obs:Jag har inte testat den här koden. Principen är sund men detaljerna kan behöva felsökas;)