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

Får du en ekstern tabels placering og filnavn?

Jeg er ikke bekendt med nogen måde at fange filnavnet inden for adgangsparametrene. Som en løsning kan du i stedet for at ændre de originale filer bruge en forprocessor til at tilføje filnavnet med det samme. Hvis du havde to filer, så sig file_1.csv indeholdende a,b,1 og file_2.csv indeholdende c,d,2 , du kunne have et lille shell-script som append_filename.sh :

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

som du kan bekræfte gør noget nyttigt ved at kalde scriptet direkte:

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

Du kan derefter definere din eksterne tabel til at kalde det via preprocessor klausul, noget som:

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.

Derefter hentes filnavnet automatisk:

select * from e42;

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

Jeg har fjernet biblioteksstien, så du kun kan se filnavnet - du kan beholde den fulde sti, hvis du foretrækker det, men det er måske ikke nødvendigt og kan afsløre OS-detaljer for folk, der kun kan forespørge i tabellen. Bemærk sikkerhedsretningslinjerne; Jeg har holdt det enkelt her ved at bruge én mappe til alt, men du bør placere forprocessoren et andet sted. Og selvfølgelig forudsætter dette en Unix-y-platform eller GNU-værktøjer; noget lignende burde være muligt med en batch-fil, hvis du bruger Windows.

Denne tilgang til at læse linje for linje vil være relativt langsom for store filer; med en testfil på 1,5 millioner rækker ved at tilføje filnavnet tog det omkring 80 sekunder på min platform. Andre indbyggede værktøjer vil være hurtigere; denne version med sed tager lidt over et sekund for den samme fil:

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

Du kan prøve andre alternativer såsom awk også; du skal nok teste et par stykker for at se, hvad der fungerer bedst (eller hurtigt nok) i dit miljø.



  1. PHP BOB - Antal rækker

  2. Hvorfor kan jeg ikke ekskludere afhængige kolonner fra "GROUP BY", når jeg samler med en nøgle?

  3. PostgreSQL INSERT ON CONFLICT UPDATE (upsert) brug alle ekskluderede værdier

  4. Sådan returneres output fra lagret procedure til en variabel i sql-server