Oracle
 sql >> Base de données >  >> RDS >> Oracle

Obtenir l'emplacement et le nom de fichier d'une table externe ?

Je ne connais aucun moyen de capturer le nom du fichier dans les paramètres d'accès. Comme solution de contournement, plutôt que de modifier les fichiers d'origine, vous pouvez utiliser un préprocesseur pour ajouter le nom du fichier à la volée. Si vous aviez deux fichiers, dites file_1.csv contenant a,b,1 et file_2.csv contenant c,d,2 , vous pourriez avoir un petit script shell comme append_filename.sh :

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

dont vous pouvez vérifier qu'il fait quelque chose d'utile en appelant directement le script :

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

Vous pouvez ensuite définir votre table externe pour l'appeler via le preprocessor clause, quelque chose comme :

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.

Ensuite, le nom du fichier est récupéré automatiquement :

select * from e42;

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

J'ai supprimé le chemin du répertoire pour que vous ne voyiez que le nom du fichier - vous pouvez conserver le chemin complet si vous préférez, mais cela peut ne pas être nécessaire et pourrait révéler les détails du système d'exploitation aux personnes qui ne peuvent interroger que la table. Notez les consignes de sécurité ; J'ai gardé les choses simples ici en utilisant un répertoire pour tout, mais vous devriez placer le préprocesseur ailleurs. Et bien sûr, cela suppose une plate-forme Unix-y ou des outils GNU ; quelque chose de similaire devrait être possible avec un fichier batch si vous utilisez Windows.

Cette approche de lecture ligne par ligne sera relativement lente pour les fichiers volumineux; avec un fichier de test de 1,5 million de lignes, ajouter le nom du fichier a pris environ 80 secondes sur ma plate-forme. D'autres outils intégrés seront plus rapides; cette version avec sed prend un peu plus d'une seconde pour le même fichier :

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

Vous pouvez essayer d'autres alternatives telles que awk aussi; vous devrez probablement en tester quelques-uns pour voir ce qui fonctionne le mieux (ou assez rapidement) dans votre environnement.