sql >> Databasteknik >  >> RDS >> Oracle

Vilka koder har korrespondens i db

Bygg en extern tabell på din CSV-fil. Dessa är mycket snygga saker som gör att vi kan fråga innehållet i en OS-fil i SQL. Läs mer .

Sedan är det en enkel fråga att skicka en fråga:

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)

Prestanda är en fråga om sammanhang. I det här fallet beror det på hur ofta data i CSV:en ändras och hur ofta vi behöver fråga efter dem. Om filen produceras en gång om dagen och vi bara behöver kontrollera värdena efter att den har levererats är en extern tabell den mest effektiva lösningen. Men om denna datamängd är ett permanent arkiv som behöver frågas ofta så är det uppenbarligen berättigat att skriva till en heaptabell.

För mig låter en CSV-fil som består av ett gäng ID:n och inget annat som övergående data och passar till användningsfallet för externa tabeller. Men OP kan ha ytterligare krav som de inte har nämnt.

Här är ett alternativt tillvägagångssätt som inte kräver att du skapar några permanenta databasobjekt. Följaktligen är den mindre elegant och kommer förmodligen att prestera sämre.

Den läser CSV-filen mödosamt med UTL_FILE och fyller i en samling baserad på SYSTEM.NUMBER_TBL_TYPE, en fördefinierad samling (kapslad tabell med NUMBER) som bör vara tillgänglig i din Oracle-databas.

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;

Obs:Jag har inte testat den här koden. Principen är sund men detaljerna kan behöva felsökas;)




  1. Lagra filsökvägar i en databas

  2. Ställa in PGPASSWORD miljövariabel för Postgres (psql) process som körs av Inno Setup

  3. Skillnad mellan två års månads- och dagvärden i Oracle

  4. Alternativ synonym i SQL Server i en transaktion