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

PLS-00103 membuat tabel eksternal dengan SQL dinamis

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengatur Parameter Bahasa Oracle untuk DG4ODBC

  2. Pilih min. tiga nilai record di tabel lain dengan JOIN

  3. Bagaimana membandingkan dua tabel kolom demi kolom di Oracle

  4. tidak dapat memasukkan bingkai data ke tabel Oracle yang ada

  5. gabung sendiri vs gabung dalam