CSVファイルに外部テーブルを作成します。これらは、SQLでOSファイルの内容をクエリできる非常に優れた機能です。 詳細a> 。
次に、クエリを発行するだけです。
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)
パフォーマンスはコンテキストの問題です。この場合、CSV内のデータが変更される頻度と、データをクエリする必要がある頻度によって異なります。ファイルが1日に1回作成され、配信後に値を確認するだけでよい場合は、外部テーブルが最も効率的なソリューションです。ただし、このデータセットが永続的なリポジトリであり、頻繁にクエリを実行する必要がある場合は、ヒープテーブルへの書き込みのオーバーヘッドが明らかに正当化されます。
私には、多数のIDと他の何も含まないCSVファイルは一時的なデータのように聞こえ、外部テーブルのユースケースに適しています。ただし、OPには、言及されていない追加の要件がある場合があります。
これは、永続的なデータベースオブジェクトを作成する必要のない代替アプローチです。その結果、エレガントさが低下し、パフォーマンスが低下する可能性があります。
UTL_FILEを使用してCSVファイルを手間をかけて読み取り、Oracleデータベースで使用できるはずの事前定義されたコレクション(NUMBERのネストされたテーブル)であるSYSTEM.NUMBER_TBL_TYPEに基づいてコレクションにデータを入力します。
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;
注:私はこのコードをテストしていません。原則は健全ですが、詳細にはデバッグが必要な場合があります;)