Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Mendapatkan lokasi dan nama file tabel eksternal?

Saya tidak mengetahui cara apa pun untuk menangkap nama file dalam parameter akses. Sebagai solusinya, daripada memodifikasi file asli, Anda dapat menggunakan praprosesor untuk menambahkan nama file dengan cepat. Jika Anda memiliki dua file, ucapkan file_1.csv mengandung a,b,1 dan file_2.csv mengandung c,d,2 , Anda dapat memiliki skrip shell kecil seperti append_filename.sh :

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

yang dapat Anda verifikasi melakukan sesuatu yang bermanfaat dengan memanggil skrip secara langsung:

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

Anda kemudian dapat menentukan tabel eksternal Anda untuk memanggilnya melalui preprocessor klausa, seperti:

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.

Kemudian nama file diambil secara otomatis:

select * from e42;

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

Saya telah menghapus jalur direktori sehingga Anda hanya melihat nama file - Anda dapat menyimpan jalur lengkap jika Anda mau, tetapi itu mungkin tidak diperlukan dan dapat mengungkapkan detail OS kepada orang-orang yang hanya dapat menanyakan tabel. Perhatikan pedoman keamanan; Saya membuatnya sederhana di sini dengan menggunakan satu direktori untuk semuanya, tetapi Anda harus meletakkan praprosesor di tempat lain. Dan tentu saja ini mengasumsikan platform Unix-y atau alat GNU; sesuatu yang serupa dapat dilakukan dengan file batch jika Anda menggunakan Windows.

Pendekatan ini membaca baris demi baris akan relatif lambat untuk file besar; dengan file uji 1,5 juta baris yang menambahkan nama file membutuhkan waktu sekitar 80 detik di platform saya. Alat bawaan lainnya akan lebih cepat; versi ini dengan sed membutuhkan lebih dari satu detik untuk file yang sama:

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

Anda bisa mencoba alternatif lain seperti awk juga; Anda mungkin perlu menguji beberapa untuk melihat apa yang terbaik (atau cukup cepat) di lingkungan Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. dbms_output ukuran buffer overflow

  2. Ambil baris yang memiliki nilai Max untuk sebuah kolom

  3. Pangkas bidang tanggal di mysql seperti Oracle

  4. Manajemen Jendela dalam Formulir Oracle D2k

  5. Apakah ada Cara untuk menggunakan Linq ke Oracle