Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Quais códigos têm correspondência no banco de dados


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