Oracle
 sql >> база данни >  >> RDS >> Oracle

Получавате местоположението на външната таблица и името на файла?

Не ми е известен начин за заснемане на името на файла в рамките на параметрите за достъп. Като заобиколно решение, вместо да модифицирате оригиналните файлове, можете да използвате препроцесор, за да добавите името на файла в движение. Ако сте имали два файла, кажете file_1.csv съдържащ a,b,1 и file_2.csv съдържащ c,d,2 , можете да имате малък шел скрипт като append_filename.sh :

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

който можете да проверите, че прави нещо полезно, като извикате директно скрипта:

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

След това можете да дефинирате вашата външна таблица, за да я извикате чрез preprocessor клауза, нещо като:

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.

След това името на файла се избира автоматично:

select * from e42;

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

Премахнах пътя към директорията, така че виждате само името на файла - можете да запазите пълния път, ако предпочитате, но това може да не е необходимо и може да разкрие подробности за операционната система на хора, които могат само да запитват таблицата. Обърнете внимание на указанията за сигурност; Тук съм го опростил, като използвам една директория за всичко, но трябва да поставите препроцесора някъде другаде. И разбира се, това предполага Unix-y платформа или GNU инструменти; нещо подобно трябва да е възможно с пакетен файл, ако използвате Windows.

Този подход четене ред по ред ще бъде сравнително бавен за големи файлове; с тестов файл от 1,5 милиона реда, добавящ името на файла, отне около 80 секунди на моята платформа. Други вградени инструменти ще бъдат по-бързи; тази версия с sed отнема малко повече от секунда за същия файл:

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

Можете да опитате друга алтернатива като awk също; вероятно ще трябва да тествате няколко, за да видите кое работи най-добре (или достатъчно бързо) във вашата среда.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изпратя произволни параметри към тригера на Oracle?

  2. UPSERT в таблица с име на динамична таблица

  3. Какво представляват PLSQL записи в Oracle

  4. Използване на setDate в PreparedStatement

  5. Агрегатна конкатенация на низове в Oracle 10g