Crie uma tabela externa em seu arquivo CSV. Essas são coisas muito legais que nos permitem consultar o conteúdo de um arquivo do SO em SQL. Saiba mais .
Então é uma simples questão de emitir uma consulta:
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)
O desempenho é uma questão de contexto. Nesse caso, depende da frequência com que os dados no CSV são alterados e com que frequência precisamos consultá-los. Se o arquivo for produzido uma vez por dia e só precisarmos verificar os valores após a entrega, uma tabela externa é a solução mais eficiente. Mas se esse conjunto de dados for um repositório permanente que precisa ser consultado com frequência, a sobrecarga de gravar em uma tabela de heap é obviamente justificada.
Para mim, um arquivo CSV que consiste em vários IDs e nada mais soa como dados transitórios e se adapta ao caso de uso de tabelas externas. Mas o OP pode ter requisitos adicionais que eles não mencionaram.
Aqui está uma abordagem alternativa que não requer a criação de nenhum objeto de banco de dados permanente. Consequentemente, é menos elegante e provavelmente terá um desempenho pior.
Ele lê o arquivo CSV laboriosamente usando UTL_FILE e preenche uma coleção baseada em SYSTEM.NUMBER_TBL_TYPE, uma coleção predefinida (tabela aninhada de NUMBER) que deve estar disponível em seu banco de dados 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:Eu não testei este código. O princípio é sólido, mas os detalhes podem precisar de depuração;)