Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Obtendo o local e o nome do arquivo de uma tabela externa?


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.