Semuanya dari ORGANIZATION
seterusnya dilihat sebagai kode PL/SQL, bukan bagian dari pernyataan SQL dinamis Anda. Anda menambahkan nama tabel ke create table
tetapi kemudian tidak menambahkan sisanya sebagai bagian dari string pernyataan itu. Anda perlu melakukan sesuatu seperti:
execute immediate 'create table ' || p_tab_name || '
( /* put column names and types here */ )
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY DE_DUBFILE
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE
CHARACTERSET US7ASCII
BADFILE UPLOAD:''' || p_tab_name || '.bad''
DISCARDFILE UPLOAD:''' || p_tab_name || '.dis''
LOGFILE UPLOAD:''' || p_tab_name || '.log''
FIELDS TERMINATED BY '',''
optionally enclosed by ''"''
MISSING FIELD VALUES ARE NULL
(
t1 ,t2,t3,t4,t5 date mask "YYYYMMDD" ,t6,t7,
t8 ,t9, t10,t11
)
LOCATION (''' || DATAFILE || ''')
)';
Pada baris pertama, titik koma terminasi telah diganti dengan rangkaian literal string baru. Referensi ke variabel p_tab_name
dan DATAFILE
harus dipisahkan dari literal itu juga, membutuhkan lebih banyak tanda kutip tunggal dan rangkaian; dan tanda kutip tunggal yang sebenarnya merupakan bagian dari pernyataan harus dihilangkan dengan menggandakannya. Ada berbagai kutipan lain yang hilang juga. Apa yang ditampilkan sekarang harus dijalankan.
Saya juga mengubah nama tabel yang digunakan menjadi p_tab_name
, tetapi Anda perlu menentukan nama kolom dan tipe data secara eksplisit. Tidak masuk akal untuk menggunakan as select * ...
untuk meja eksternal. Itu bukan sintaks yang sah, baik sebelum organization
atau setelah sisanya jika pernyataan saat ini. Saya kira Anda dapat mengekstrak informasi itu dari all_tab_columns
dan buat bagian itu secara dinamis juga, tetapi jika Anda mendasarkannya pada tabel tetap, Anda tetap harus mengetahuinya.
Logika Anda untuk menjatuhkan/membuat juga tidak aktif - saya pikir Anda hanya ingin:
if n>0 then
execute immediate 'drop table ' || p_tab_name;
end if;
execute immediate 'create table ' || p_tab_name || '
...
... jadi Anda tidak perlu mengulang pernyataan create di kedua cabang.
Saya juga telah memperbaiki beberapa kesalahan lainnya; PARAMETERS
daripada PARAMETERS
; FIELDS
daripada FILEDS
; menghapus TRAILING NULLCOLS
. Cobalah untuk menjalankan perintah sebagai SQL statis sebelum mengubahnya menjadi dinamis. Mungkin masih ada masalah lain.
Dan saya telah menghapus dua kolom terhitung terakhir:
DETL_CLMNS_HASH "ORA_HASH( :t4||:t7 )",
KEY_CLMNS_HASH "ORA_HASH(:t1||:t2||:t5)")
ORACLE_LOADER
pengemudi
tidak mengizinkan manipulasi seperti itu; SQL*Loader melakukannya tetapi tidak persis sama. Anda juga tidak dapat menentukan kolom virtual pada tabel eksternal. Jika Anda menggunakan ini sebagai tabel pementasan untuk memuat data ke tabel (nyata) lain, maka Anda dapat menghitung hash tersebut selama transfer; jika tidak, Anda dapat membuat tampilan tabel eksternal ini yang menyertakan kolom terhitung.