sql >> Database teknologi >  >> RDS >> Oracle

Hvilke koder har korrespondance i db

Byg en ekstern tabel på din CSV-fil. Disse er meget pæne ting, som giver os mulighed for at forespørge på indholdet af en OS-fil i SQL. Få mere at vide .

Så er det et simpelt spørgsmål om at udstede en forespørgsel:

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)

Performance er et spørgsmål om kontekst. I dette tilfælde afhænger det af, hvor ofte dataene i CSV'en ændres, og hvor ofte vi skal forespørge på dem. Hvis filen produceres én gang om dagen, og vi kun skal tjekke værdierne efter at den er leveret, er en ekstern tabel den mest effektive løsning. Men hvis dette datasæt er et permanent lager, som skal forespørges ofte, så er overheaden ved at skrive til en heap-tabel naturligvis berettiget.

For mig lyder en CSV-fil bestående af en masse ID'er og intet andet som forbigående data og passer til brugen af ​​eksterne tabeller. Men OP kan have yderligere krav, som de ikke har nævnt.

Her er en alternativ tilgang, som ikke kræver oprettelse af permanente databaseobjekter. Derfor er den mindre elegant og vil sandsynligvis fungere dårligere.

Den læser CSV-filen møjsommeligt ved hjælp af UTL_FILE og udfylder en samling baseret på SYSTEM.NUMBER_TBL_TYPE, en foruddefineret samling (indlejret tabel med NUMBER), som burde være tilgængelig i din Oracle-database.

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;

Bemærk:Jeg har ikke testet denne kode. Princippet er forsvarligt, men detaljerne skal muligvis fejlfindes;)




  1. Generering af en ordnet sekvensrangering på kompleks forespørgsel

  2. automatisk forøgelse af anden kolonne

  3. Brug af CASE-udtryk i SQL Server

  4. PHP:mysql_fetch_array() forventer, at parameter 1 er ressource, boolesk givet