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

Speicherort und Dateiname einer externen Tabelle abrufen?

Mir ist keine Möglichkeit bekannt, den Dateinamen innerhalb der Zugriffsparameter zu erfassen. Als Problemumgehung können Sie, anstatt die Originaldateien zu ändern, einen Präprozessor verwenden, um den Dateinamen im laufenden Betrieb anzuhängen. Wenn Sie zwei Dateien hatten, sagen Sie file_1.csv enthält a,b,1 und file_2.csv enthält c,d,2 , könnten Sie ein kleines Shell-Skript wie append_filename.sh verwenden :

#!/bin/bash
while read line
do
  printf "%s,%s\n" "${line}" "${1##*/}"
done < $1

was Sie überprüfen können, indem Sie das Skript direkt aufrufen:

$ ./append_filename.sh file_1.csv
a,b,1,file_1.csv

Sie können dann Ihre externe Tabelle so definieren, dass sie über den preprocessor aufgerufen wird Klausel, so etwas wie:

create table e42 (
  col1 varchar2(10),
  col2 varchar2(10),
  col3 number,
  filename varchar2(30)
)
organization external (
  type oracle_loader
  default directory d42
  access parameters (
    records delimited by newline
    preprocessor 'append_filename.sh'
    fields terminated by ','
  )
  location ('file_1.csv', 'file_2.csv')
);

Table E42 created.

Dann wird der Dateiname automatisch übernommen:

select * from e42;

COL1       COL2             COL3 FILENAME                     
---------- ---------- ---------- ------------------------------
a          b                   1 file_1.csv                    
c          d                   2 file_2.csv                    

Ich habe den Verzeichnispfad entfernt, sodass Sie nur den Dateinamen sehen. Sie könnten den vollständigen Pfad beibehalten, wenn Sie dies bevorzugen, aber das ist möglicherweise nicht erforderlich und könnte Personen, die nur die Tabelle abfragen können, OS-Details offenbaren. Beachten Sie die Sicherheitsrichtlinien; Ich habe es hier einfach gehalten, indem ich ein Verzeichnis für alles verwende, aber Sie sollten den Präprozessor woanders ablegen. Und natürlich setzt dies eine Unix-y-Plattform oder GNU-Tools voraus; Ähnliches sollte mit einer Batch-Datei möglich sein, wenn Sie Windows verwenden.

Dieser Ansatz, Zeile für Zeile zu lesen, wird bei großen Dateien relativ langsam sein; bei einer Testdatei mit 1,5 Millionen Zeilen dauerte das Anhängen des Dateinamens auf meiner Plattform etwa 80 Sekunden. Andere integrierte Tools sind schneller; diese Version mit sed dauert etwas mehr als eine Sekunde für dieselbe Datei:

#!/bin/bash
sed -e 's!$!,'"${1##*/}"'!' $1

Sie könnten andere Alternativen wie awk ausprobieren zu; Sie müssten wahrscheinlich ein paar testen, um zu sehen, was in Ihrer Umgebung am besten (oder schnell genug) funktioniert.