Não conheço nenhuma maneira de capturar o nome do arquivo dentro dos parâmetros de acesso. Como solução alternativa, em vez de modificar os arquivos originais, você pode usar um pré-processador para anexar o nome do arquivo rapidamente. Se você tiver dois arquivos, diga
file_1.csv
contendo a,b,1
e file_2.csv
contendo c,d,2
, você pode ter um pequeno script de shell como append_filename.sh
:#!/bin/bash
while read line
do
printf "%s,%s\n" "${line}" "${1##*/}"
done < $1
que você pode verificar faz algo útil chamando o script diretamente:
$ ./append_filename.sh file_1.csv
a,b,1,file_1.csv
Você pode então definir sua tabela externa para chamá-la através do
preprocessor
cláusula, algo como: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.
Em seguida, o nome do arquivo é selecionado automaticamente:
select * from e42;
COL1 COL2 COL3 FILENAME
---------- ---------- ---------- ------------------------------
a b 1 file_1.csv
c d 2 file_2.csv
Eu retirei o caminho do diretório para que você veja apenas o nome do arquivo - você pode manter o caminho completo, se preferir, mas isso pode não ser necessário e pode revelar detalhes do sistema operacional para pessoas que só podem consultar a tabela. Observe as diretrizes de segurança; Eu mantive simples aqui usando um diretório para tudo, mas você deve colocar o pré-processador em outro lugar. E é claro que isso pressupõe uma plataforma Unix-y ou ferramentas GNU; algo semelhante deve ser possível com um arquivo em lotes se você estiver usando o Windows.
Essa abordagem de leitura linha por linha será relativamente lenta para arquivos grandes; com um arquivo de teste de 1,5 milhão de linhas anexando o nome do arquivo levou cerca de 80 segundos na minha plataforma. Outras ferramentas integradas serão mais rápidas; esta versão com
sed
leva pouco mais de um segundo para o mesmo arquivo:#!/bin/bash
sed -e 's!$!,'"${1##*/}"'!' $1
Você pode tentar outra alternativa, como
awk
também; você provavelmente precisaria testar alguns para ver o que funciona melhor (ou rápido o suficiente) em seu ambiente.