sql >> Databáze >  >> RDS >> Oracle

Které kódy mají shodu v db

Vytvořte externí tabulku ze souboru CSV. To jsou velmi elegantní věci, které nám umožňují dotazovat se na obsah souboru OS v SQL. Další informace .

Pak je to jednoduchá záležitost zadání dotazu:

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)

Výkon je otázkou kontextu. V tomto případě záleží na tom, jak často se data v CSV mění a jak často je potřebujeme dotazovat. Pokud se soubor vyrábí jednou denně a po dodání potřebujeme pouze zkontrolovat hodnoty, pak je externí tabulka nejefektivnějším řešením. Ale pokud je tato datová sada trvalým úložištěm, které je třeba často dotazovat, pak je režie zápisu do tabulky haldy zjevně oprávněná.

Soubor CSV sestávající z mnoha ID a ničeho jiného mi zní jako přechodná data a hodí se pro případ použití pro externí tabulky. Operační program však může mít další požadavky, které nezmínil.

Zde je alternativní přístup, který nevyžaduje vytváření žádných trvalých databázových objektů. V důsledku toho je méně elegantní a pravděpodobně bude fungovat hůře.

Načte soubor CSV pracně pomocí UTL_FILE a naplní kolekci založenou na SYSTEM.NUMBER_TBL_TYPE, předdefinované kolekci (vnořená tabulka NUMBER), která by měla být dostupná ve vaší databázi 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;

Poznámka:Tento kód jsem netestoval. Princip je dobrý, ale detaily mohou vyžadovat ladění;)




  1. SQL Server 2016 v systému Linux

  2. SQL Server:Připojte nesprávnou verzi 661

  3. Vložení NULL do časového razítka MySQL

  4. Chyba vložení PHP/SQL při použití pojmenovaných zástupných symbolů