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

Ottenere la posizione di una tabella esterna e il nome del file?

Non sono a conoscenza di alcun modo per acquisire il nome del file all'interno dei parametri di accesso. Come soluzione alternativa, invece di modificare i file originali è possibile utilizzare un preprocessore per aggiungere il nome del file al volo. Se avevi due file, dì file_1.csv contenente a,b,1 e file_2.csv contenente c,d,2 , potresti avere un piccolo script di shell come append_filename.sh :

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

che puoi verificare fa qualcosa di utile chiamando direttamente lo script:

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

Puoi quindi definire la tua tabella esterna per chiamarla tramite il preprocessor clausola, qualcosa come:

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.

Quindi il nome del file viene prelevato automaticamente:

select * from e42;

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

Ho rimosso il percorso della directory in modo da vedere solo il nome del file:puoi mantenere il percorso completo se preferisci, ma potrebbe non essere necessario e potrebbe rivelare i dettagli del sistema operativo a persone che possono solo interrogare la tabella. Prendere nota delle linee guida sulla sicurezza; L'ho mantenuto semplice qui usando una directory per tutto, ma dovresti mettere il preprocessore da qualche altra parte. E ovviamente questo presuppone una piattaforma Unix-y o strumenti GNU; qualcosa di simile dovrebbe essere possibile con un file batch se stai usando Windows.

Questo approccio alla lettura riga per riga sarà relativamente lento per file di grandi dimensioni; con un file di prova di 1,5 milioni di righe che aggiunge il nome del file ha impiegato circa 80 secondi sulla mia piattaforma. Altri strumenti integrati saranno più veloci; questa versione con sed impiega poco più di un secondo per lo stesso file:

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

Potresti provare altre alternative come awk anche; probabilmente dovresti testarne alcuni per vedere cosa funziona meglio (o abbastanza velocemente) nel tuo ambiente.