Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Welche Codes haben Entsprechung in der db

Erstellen Sie eine externe Tabelle in Ihrer CSV-Datei. Dies sind sehr nette Dinge, die es uns ermöglichen, den Inhalt einer Betriebssystemdatei in SQL abzufragen. Weitere Informationen .

Dann ist es eine einfache Sache, eine Abfrage abzusetzen:

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)

Leistung ist eine Frage des Kontexts. In diesem Fall hängt es davon ab, wie oft sich die Daten in der CSV ändern und wie oft wir sie abfragen müssen. Wenn die Datei einmal am Tag erstellt wird und wir die Werte erst nach der Lieferung überprüfen müssen, ist eine externe Tabelle die effizienteste Lösung. Wenn dieser Datensatz jedoch ein permanentes Repository ist, das häufig abgefragt werden muss, ist der Overhead des Schreibens in eine Heap-Tabelle offensichtlich gerechtfertigt.

Für mich klingt eine CSV-Datei, die aus einer Reihe von IDs und nichts anderem besteht, nach transienten Daten und erfüllt den Anwendungsfall für externe Tabellen. Das OP hat jedoch möglicherweise zusätzliche Anforderungen, die es nicht erwähnt hat.

Hier ist ein alternativer Ansatz, bei dem keine permanenten Datenbankobjekte erstellt werden müssen. Folglich ist es weniger elegant und wird wahrscheinlich schlechter abschneiden.

Es liest die CSV-Datei mühsam mit UTL_FILE und füllt eine Sammlung basierend auf SYSTEM.NUMBER_TBL_TYPE, eine vordefinierte Sammlung (verschachtelte Tabelle von NUMBER), die in Ihrer Oracle-Datenbank verfügbar sein sollte.

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;

Hinweis:Ich habe diesen Code nicht getestet. Das Prinzip ist solide, aber die Details müssen möglicherweise debuggt werden;)