sql >> Databáze >  >> RDS >> Oracle

Získáváte umístění a název souboru externí tabulky?

Nevím o žádném způsobu, jak zachytit název souboru v rámci přístupových parametrů. Jako náhradní řešení můžete místo úpravy původních souborů použít preprocesor k připojení názvu souboru za chodu. Pokud jste měli dva soubory, řekněte file_1.csv obsahující a,b,1 a file_2.csv obsahující c,d,2 , můžete mít malý shell skript jako append_filename.sh :

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

který můžete ověřit, že dělá něco užitečného přímým voláním skriptu:

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

Poté můžete definovat svou externí tabulku, která ji bude volat prostřednictvím preprocessor klauzule, něco jako:

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.

Poté se automaticky vybere název souboru:

select * from e42;

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

Odstranil jsem cestu k adresáři, takže vidíte pouze název souboru - můžete si ponechat úplnou cestu, pokud chcete, ale to nemusí být nutné a mohlo by to odhalit podrobnosti o OS lidem, kteří mohou pouze dotazovat tabulku. Všimněte si bezpečnostních pokynů; Zjednodušil jsem to zde použitím jednoho adresáře pro všechno, ale preprocesor byste měli umístit jinam. A to samozřejmě za předpokladu platformy Unix-y nebo nástrojů GNU; něco podobného by mělo být možné s dávkovým souborem, pokud používáte Windows.

Tento přístup čtení řádku po řádku bude u velkých souborů relativně pomalý; s testovacím souborem s 1,5 miliony řádků a připojením názvu souboru trvalo na mé platformě asi 80 sekund. Ostatní vestavěné nástroje budou rychlejší; tato verze s sed trvá jen něco málo přes sekundu pro stejný soubor:

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

Můžete zkusit jinou alternativu, jako je awk také; pravděpodobně budete muset několik otestovat, abyste viděli, co ve vašem prostředí funguje nejlépe (nebo dostatečně rychle).



  1. 10 neobvyklých tipů pro Microsoft Access 2019

  2. Používání Dockeru na Azure Container Service s Swarm Cluster

  3. Návrh spouštěče Microsoft T-SQL

  4. Ignoruje MySQL hodnoty null na jedinečných omezeních?