sql >> Base de Datos >  >> RDS >> Oracle

Que codigos tienen correspondencia en la db

Cree una tabla externa en su archivo CSV. Estas son cosas muy interesantes que nos permiten consultar el contenido de un archivo del sistema operativo en SQL. Más información .

Entonces es una simple cuestión de emitir una 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)

El rendimiento es una cuestión de contexto. En este caso, depende de la frecuencia con la que cambien los datos en el CSV y la frecuencia con la que necesitemos consultarlo. Si el archivo se produce una vez al día y solo necesitamos verificar los valores después de que se haya entregado, entonces una tabla externa es la solución más eficiente. Pero si este conjunto de datos es un depósito permanente que debe consultarse con frecuencia, entonces la sobrecarga de escribir en una tabla de montón está obviamente justificada.

Para mí, un archivo CSV que consta de un montón de ID y nada más suena como datos transitorios y se ajusta al caso de uso de tablas externas. Pero el OP puede tener requisitos adicionales que no han mencionado.

Aquí hay un enfoque alternativo que no requiere la creación de ningún objeto de base de datos permanente. En consecuencia, es menos elegante y probablemente funcionará peor.

Lee el archivo CSV laboriosamente usando UTL_FILE y completa una colección basada en SYSTEM.NUMBER_TBL_TYPE, una colección predefinida (tabla anidada de NÚMERO) que debería estar disponible en su base de datos 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:No he probado este código. El principio es sólido, pero es posible que sea necesario depurar los detalles;)