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

Oracle SQL-Loader menangani Kutipan Ganda internal secara efisien dalam nilai

Jika Anda tidak pernah memiliki pipa di bidang terlampir, Anda dapat melakukannya dari file kontrol. Jika Anda dapat memiliki kedua pipa dan tanda kutip ganda dalam bidang, maka saya pikir Anda tidak punya pilihan selain memproses file terlebih dahulu, sayangnya.

Solusi Anda [1], untuk mengganti tanda kutip ganda dengan operator SQL , terjadi terlambat untuk menjadi berguna; pembatas dan penutup telah diinterpretasikan oleh SQL*Loader sebelum melakukan langkah SQL. Solusi Anda [2], untuk mengabaikan enklosur, akan bekerja dalam kombinasi dengan [1] - hingga salah satu bidang memang berisi karakter pipa. Dan solusi [3] memiliki masalah yang sama dengan menggunakan [1] dan/atau [2] secara global.

Dokumentasi untuk menentukan pembatas menyebutkan bahwa:

Dengan kata lain, jika Anda mengulangi tanda kutip ganda di dalam bidang maka mereka akan diloloskan dan akan muncul di tabel data. Karena Anda tidak dapat mengontrol pembuatan data, Anda dapat melakukan praproses file yang Anda dapatkan untuk mengganti semua tanda kutip ganda dengan tanda kutip ganda yang lolos. Kecuali Anda tidak ingin mengganti semua dari mereka - yang sebenarnya merupakan kandang nyata tidak boleh diloloskan.

Anda bisa menggunakan ekspresi reguler untuk menargetkan karakter yang relevan yang akan dilewati orang lain. Bukan bidang saya yang kuat, tetapi saya pikir Anda dapat melakukannya dengan pernyataan lookahead dan lookbehind .

Jika Anda memiliki file bernama orig.txt berisi:

"1"|A|"B"|"C|D"
"2"|A|"B"|"C"D"
3|A|""B""|"C|D"
4|A|"B"|"C"D|E"F"G|H""

Anda bisa melakukan:

perl -pe 's/(?<!^)(?<!\|)"(?!\|)(?!$)/""/g' orig.txt > new.txt

Itu mencari tanda kutip ganda yang tidak didahului oleh jangkar baris-mulai atau karakter pipa; dan tidak diikuti oleh karakter pipa atau jangkar ujung garis; dan hanya menggantikan mereka dengan tanda kutip ganda yang lolos (dua kali lipat). Yang akan membuat new.txt berisi:

"1"|A|"B"|"C|D"
"2"|A|"B"|"C""D"
3|A|"""B"""|"C|D"
4|A|"B"|"C""D|E""F""G|H"""

Tanda kutip ganda di awal dan akhir bidang tidak diubah, tetapi tanda kutip di tengah sekarang diloloskan. Jika Anda kemudian memuatnya dengan file kontrol dengan lampiran tanda kutip ganda:

load data
truncate
into table t42
fields terminated by '|' optionally enclosed by '"'
(
  col1,
  col2,
  col3,
  col4
)

Maka Anda akan berakhir dengan:

select * from t42 order by col1;

      COL1 COL2       COL3       COL4                
---------- ---------- ---------- --------------------
         1 A          B          C|D                 
         2 A          B          C"D                 
         3 A          "B"        C|D                 
         3 A          B          C"D|E"F"G|H"        

yang mudah-mudahan cocok dengan data asli Anda. Mungkin ada kasus tepi yang tidak berfungsi (seperti tanda kutip ganda diikuti oleh pipa di dalam bidang) tetapi ada batasan untuk apa yang dapat Anda lakukan untuk mencoba menafsirkan data orang lain... Mungkin juga ada (banyak) pola ekspresi reguler yang lebih baik, tentu saja.

Anda juga dapat mempertimbangkan untuk menggunakan tabel eksternal alih-alih SQL*Loader, jika file data berada (atau bisa) di direktori Oracle dan Anda memiliki izin yang tepat. Anda masih harus memodifikasi file, tetapi Anda dapat melakukannya secara otomatis dengan preprocessor direktif, daripada perlu melakukannya secara eksplisit sebelum memanggil SQL*Loader.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Variabel tabel dalam prosedur tersimpan Oracle

  2. java.lang.UnsupportedOperationException:org.hibernate.dialect.Oracle10gDialect tidak mendukung hasil melalui prosedur tersimpan

  3. Konversikan data kolom perbedaan TIMESTAMP ke format string

  4. Bagaimana saya bisa mengonfigurasi lokasi file tnsnames Oracle saya?

  5. Oracle Pl/SQL:Loop melalui node XMLTYPE