Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Uzyskujesz lokalizację i nazwę pliku tabeli zewnętrznej?

Nie znam żadnego sposobu na przechwycenie nazwy pliku w parametrach dostępu. Jako obejście, zamiast modyfikować oryginalne pliki, możesz użyć preprocesora, aby dołączyć nazwę pliku w locie. Jeśli masz dwa pliki, powiedz file_1.csv zawierające a,b,1 i file_2.csv zawierające c,d,2 , możesz mieć mały skrypt powłoki, taki jak append_filename.sh :

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

który możesz sprawdzić, robi coś przydatnego, wywołując skrypt bezpośrednio:

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

Następnie możesz zdefiniować swoją zewnętrzną tabelę, aby wywołać ją za pomocą preprocessor klauzula, coś w stylu:

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.

Następnie nazwa pliku jest pobierana automatycznie:

select * from e42;

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

Usunąłem ścieżkę do katalogu, więc widzisz tylko nazwę pliku – możesz zachować pełną ścieżkę, jeśli wolisz, ale może to nie być konieczne i może ujawnić szczegóły systemu operacyjnego osobom, które mogą tylko przeszukiwać tabelę. Zwróć uwagę na wytyczne dotyczące bezpieczeństwa; Utrzymałem to w prosty sposób, używając jednego katalogu do wszystkiego, ale powinieneś umieścić preprocesor w innym miejscu. I oczywiście zakłada to platformę Unix-y lub narzędzia GNU; coś podobnego powinno być możliwe z plikiem wsadowym, jeśli używasz systemu Windows.

Takie podejście do czytania wiersz po wierszu będzie stosunkowo powolne w przypadku dużych plików; z plikiem testowym zawierającym 1,5 miliona wierszy dołączenie nazwy pliku zajęło mi około 80 sekund na mojej platformie. Inne wbudowane narzędzia będą szybsze; ta wersja z sed zajmuje nieco ponad sekundę dla tego samego pliku:

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

Możesz wypróbować inną alternatywę, taką jak awk też; prawdopodobnie będziesz musiał przetestować kilka, aby zobaczyć, co działa najlepiej (lub wystarczająco szybko) w Twoim środowisku.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Październik 2014Procesor ulega awarii ArcGIS Desktop

  2. Wywołanie procedury Oracle z parametrem typu kolekcji PL/SQL przez .NET

  3. Wprowadzenie do Oracle Mobile Cloud Service

  4. ORA-03113:koniec pliku na kanale komunikacyjnym

  5. Jak eksportować dane za pomocą Oracle SQL Developer?