Bouw een externe tabel op uw CSV-bestand. Dit zijn zeer nette dingen waarmee we de inhoud van een OS-bestand in SQL kunnen opvragen. Meer informatie .
Dan is het een kwestie van een vraag stellen:
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)
Prestaties zijn een kwestie van context. In dit geval hangt het af van hoe vaak de gegevens in de CSV veranderen en hoe vaak we deze moeten opvragen. Als het bestand één keer per dag wordt aangemaakt en we de waarden pas na aanlevering hoeven te controleren, dan is een externe tabel de meest efficiënte oplossing. Maar als deze dataset een permanente repository is die vaak moet worden opgevraagd, dan is de overhead van het schrijven naar een heaptabel uiteraard gerechtvaardigd.
Voor mij klinkt een CSV-bestand dat bestaat uit een aantal ID's en niets anders als tijdelijke gegevens en past het in de use case voor externe tabellen. Maar het OP heeft mogelijk aanvullende vereisten die ze niet hebben genoemd.
Hier is een alternatieve benadering waarvoor geen permanente database-objecten hoeven te worden gemaakt. Daardoor is het minder elegant en zal het waarschijnlijk slechter presteren.
Het leest het CSV-bestand moeizaam met behulp van UTL_FILE en vult een verzameling op basis van SYSTEM.NUMBER_TBL_TYPE, een vooraf gedefinieerde verzameling (geneste tabel van NUMBER) die beschikbaar zou moeten zijn in uw 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;
Opmerking:ik heb deze code niet getest. Het principe is goed, maar de details moeten mogelijk worden gedebugd;)