sql >> Databasteknik >  >> RDS >> Oracle

Får du en extern tabells plats och filnamn?

Jag är inte medveten om något sätt att fånga filnamnet inom åtkomstparametrarna. Som en lösning kan du istället för att modifiera originalfilerna använda en förprocessor för att lägga till filnamnet direkt. Om du hade två filer, säg file_1.csv som innehåller a,b,1 och file_2.csv som innehåller c,d,2 , kan du ha ett litet skalskript som append_filename.sh :

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

som du kan verifiera gör något användbart genom att anropa skriptet direkt:

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

Du kan sedan definiera din externa tabell för att anropa den via preprocessor klausul, något i stil med:

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.

Då plockas filnamnet upp automatiskt:

select * from e42;

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

Jag har tagit bort katalogsökvägen så att du bara ser filnamnet - du kan behålla hela sökvägen om du föredrar det, men det kanske inte är nödvändigt och kan avslöja OS-detaljer för personer som bara kan fråga i tabellen. Observera säkerhetsriktlinjerna; Jag har gjort det enkelt här genom att använda en katalog för allt, men du bör placera förprocessorn någon annanstans. Och naturligtvis förutsätter detta en Unix-y-plattform eller GNU-verktyg; något liknande borde vara möjligt med en batchfil om du använder Windows.

Denna metod att läsa rad för rad kommer att vara relativt långsam för stora filer; med en testfil på 1,5 miljoner rader som lade till filnamnet tog det cirka 80 sekunder på min plattform. Andra inbyggda verktyg kommer att vara snabbare; denna version med sed tar drygt en sekund för samma fil:

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

Du kan prova andra alternativ som awk för; du skulle förmodligen behöva testa några för att se vad som fungerar bäst (eller tillräckligt snabbt) i din miljö.



  1. Hur LOAD_FILE()-funktionen fungerar i MySQL

  2. Grundläggande administration av Oracle 12c Multitenant

  3. Vad är LIKE Logical Operator i SQL Server - SQL Server / TSQL Tutorial Del 123

  4. Hur hjälper pgBouncer till att påskynda Django