Crea una tabella esterna sul tuo file CSV. Queste sono cose molto pulite che ci consentono di interrogare il contenuto di un file del sistema operativo in SQL. Scopri di più .
Quindi è una semplice questione di emettere una query:
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)
Le prestazioni sono una questione di contesto. In questo caso dipende dalla frequenza con cui cambiano i dati nel CSV e dalla frequenza con cui dobbiamo interrogarli. Se il file viene prodotto una volta al giorno e dobbiamo controllare i valori solo dopo che è stato consegnato, una tabella esterna è la soluzione più efficiente. Ma se questo set di dati è un repository permanente che deve essere interrogato spesso, il sovraccarico di scrittura su una tabella heap è ovviamente giustificato.
Per me, un file CSV composto da un gruppo di ID e nient'altro suona come dati transitori e si adatta al caso d'uso per le tabelle esterne. Ma l'OP potrebbe avere requisiti aggiuntivi che non hanno menzionato.
Ecco un approccio alternativo che non richiede la creazione di oggetti di database permanenti. Di conseguenza è meno elegante e probabilmente funzionerà peggio.
Legge laboriosamente il file CSV utilizzando UTL_FILE e popola una raccolta basata su SYSTEM.NUMBER_TBL_TYPE, una raccolta predefinita (tabella nidificata di NUMBER) che dovrebbe essere disponibile nel database 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;
Nota:non ho testato questo codice. Il principio è valido, ma potrebbe essere necessario eseguire il debug dei dettagli;)