Erstellen Sie eine externe Tabelle in Ihrer CSV-Datei. Dies sind sehr nette Dinge, die es uns ermöglichen, den Inhalt einer Betriebssystemdatei in SQL abzufragen. Weitere Informationen .
Dann ist es eine einfache Sache, eine Abfrage abzusetzen:
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)
Leistung ist eine Frage des Kontexts. In diesem Fall hängt es davon ab, wie oft sich die Daten in der CSV ändern und wie oft wir sie abfragen müssen. Wenn die Datei einmal am Tag erstellt wird und wir die Werte erst nach der Lieferung überprüfen müssen, ist eine externe Tabelle die effizienteste Lösung. Wenn dieser Datensatz jedoch ein permanentes Repository ist, das häufig abgefragt werden muss, ist der Overhead des Schreibens in eine Heap-Tabelle offensichtlich gerechtfertigt.
Für mich klingt eine CSV-Datei, die aus einer Reihe von IDs und nichts anderem besteht, nach transienten Daten und erfüllt den Anwendungsfall für externe Tabellen. Das OP hat jedoch möglicherweise zusätzliche Anforderungen, die es nicht erwähnt hat.
Hier ist ein alternativer Ansatz, bei dem keine permanenten Datenbankobjekte erstellt werden müssen. Folglich ist es weniger elegant und wird wahrscheinlich schlechter abschneiden.
Es liest die CSV-Datei mühsam mit UTL_FILE und füllt eine Sammlung basierend auf SYSTEM.NUMBER_TBL_TYPE, eine vordefinierte Sammlung (verschachtelte Tabelle von NUMBER), die in Ihrer Oracle-Datenbank verfügbar sein sollte.
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;
Hinweis:Ich habe diesen Code nicht getestet. Das Prinzip ist solide, aber die Details müssen möglicherweise debuggt werden;)