Oracle
 sql >> Database >  >> RDS >> Oracle

Quali codici hanno corrispondenza nel db

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;)