sql >> Database >  >> RDS >> Oracle

De locatie en bestandsnaam van een externe tabel verkrijgen?

Ik ben niet op de hoogte van een manier om de bestandsnaam vast te leggen binnen de toegangsparameters. Als tijdelijke oplossing kunt u, in plaats van de originele bestanden te wijzigen, een preprocessor gebruiken om de bestandsnaam direct toe te voegen. Als je twee bestanden had, zeg dan file_1.csv met a,b,1 en file_2.csv met c,d,2 , zou je een klein shellscript kunnen hebben zoals append_filename.sh :

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

die u kunt verifiëren, doet iets nuttigs door het script rechtstreeks aan te roepen:

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

U kunt dan uw externe tabel definiëren om die aan te roepen via de preprocessor clausule, zoiets als:

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.

Dan wordt de bestandsnaam automatisch opgehaald:

select * from e42;

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

Ik heb het directorypad gestript zodat je alleen de bestandsnaam ziet - je zou het volledige pad kunnen behouden als je wilt, maar dat is misschien niet nodig en kan OS-details onthullen aan mensen die alleen de tabel kunnen doorzoeken. Let op de beveiligingsrichtlijnen; Ik heb het hier eenvoudig gehouden door voor alles één map te gebruiken, maar je moet de preprocessor ergens anders plaatsen. En natuurlijk is dit uitgaande van een Unix-y-platform of GNU-tools; iets soortgelijks zou mogelijk moeten zijn met een batchbestand als je Windows gebruikt.

Deze aanpak regel voor regel lezen zal relatief traag zijn voor grote bestanden; met een testbestand van 1,5 miljoen rijen dat de bestandsnaam toevoegde, duurde het ongeveer 80 seconden op mijn platform. Andere ingebouwde tools zullen sneller zijn; deze versie met sed duurt iets meer dan een seconde voor hetzelfde bestand:

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

Je zou een ander alternatief kunnen proberen, zoals awk te; je zou er waarschijnlijk een paar moeten testen om te zien wat het beste (of snel genoeg) werkt in jouw omgeving.



  1. SQL Server:handige tips voor beginners

  2. Hoe verschillende records uit een tabel in SQL Server te halen - SQL Server / TSQL-zelfstudie 112

  3. Vergelijking van SQL-hoofdlettergevoelige tekenreeksen

  4. Oracle SQL plus hoe de opdracht in het SQL-bestand te beëindigen?