sql >> Database >  >> RDS >> Oracle

Welke codes corresponderen in de db

Bouw een externe tabel op uw CSV-bestand. Dit zijn zeer nette dingen waarmee we de inhoud van een OS-bestand in SQL kunnen opvragen. Meer informatie .

Dan is het een kwestie van een vraag stellen:

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)

Prestaties zijn een kwestie van context. In dit geval hangt het af van hoe vaak de gegevens in de CSV veranderen en hoe vaak we deze moeten opvragen. Als het bestand één keer per dag wordt aangemaakt en we de waarden pas na aanlevering hoeven te controleren, dan is een externe tabel de meest efficiënte oplossing. Maar als deze dataset een permanente repository is die vaak moet worden opgevraagd, dan is de overhead van het schrijven naar een heaptabel uiteraard gerechtvaardigd.

Voor mij klinkt een CSV-bestand dat bestaat uit een aantal ID's en niets anders als tijdelijke gegevens en past het in de use case voor externe tabellen. Maar het OP heeft mogelijk aanvullende vereisten die ze niet hebben genoemd.

Hier is een alternatieve benadering waarvoor geen permanente database-objecten hoeven te worden gemaakt. Daardoor is het minder elegant en zal het waarschijnlijk slechter presteren.

Het leest het CSV-bestand moeizaam met behulp van UTL_FILE en vult een verzameling op basis van SYSTEM.NUMBER_TBL_TYPE, een vooraf gedefinieerde verzameling (geneste tabel van NUMBER) die beschikbaar zou moeten zijn in uw 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;

Opmerking:ik heb deze code niet getest. Het principe is goed, maar de details moeten mogelijk worden gedebugd;)




  1. Functie of procedure voor een IN-clausule

  2. Knee-Jerk Wait-statistieken:PAGEIOLATCH_SH

  3. MySQL Sorteren op kolom =x, kolom oplopend?

  4. Forceer Oracle Drop Global Temp Table