Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

PLS-00103 tạo một bảng bên ngoài với SQL động

Mọi thứ từ ORGANIZATION trở đi sẽ được xem là mã PL / SQL, không phải là một phần của câu lệnh SQL động của bạn. Bạn đang thêm tên bảng vào create table nhưng sau đó không nối phần còn lại như một phần của chuỗi câu lệnh đó. Bạn cần thực hiện một số việc như:

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 || ''')    
)';

Trong dòng đầu tiên, dấu chấm phẩy kết thúc đã được thay thế bằng cách nối một chuỗi ký tự mới. Tham chiếu đến các biến p_tab_nameDATAFILE cũng phải được chia nhỏ từ nghĩa đen đó, đòi hỏi nhiều dấu ngoặc kép và nối; và các dấu ngoặc kép thực sự là một phần của câu lệnh cần được thoát ra bằng cách nhân đôi chúng lên. Cũng có nhiều trích dẫn khác bị thiếu. Những gì được hiển thị bây giờ sẽ chạy.

Tôi cũng đã thay đổi tên bảng đang được sử dụng thành chỉ p_tab_name , nhưng bạn cần chỉ định tên cột và kiểu dữ liệu một cách rõ ràng. Sẽ không hợp lý khi sử dụng as select * ... cho một bảng bên ngoài. Đó không phải là cú pháp hợp pháp, trước organization hoặc sau phần còn lại nếu câu lệnh hiện tại. Tôi cho rằng bạn có thể trích xuất thông tin đó từ all_tab_columns và xây dựng phần đó một cách linh động, nhưng nếu bạn đang đặt nó trên một bảng cố định, bạn nên biết những điều đó.

Logic của bạn để giảm / tạo cũng bị tắt - Tôi nghĩ bạn chỉ muốn:

if n>0 then                                    
  execute immediate 'drop table ' || p_tab_name; 
end if;
execute immediate 'create table ' || p_tab_name || '
...

... vì vậy bạn không phải lặp lại câu lệnh create trong cả hai nhánh.

Tôi cũng đã sửa một số sai lầm khác; PARAMETERS thay vào đó là PARAMETER; FIELDS thay vào đó là FILEDS; đã loại bỏ TRAILING NULLCOLS . Cố gắng thực thi lệnh dưới dạng SQL tĩnh trước khi chuyển đổi nó thành động. Có thể vẫn còn các vấn đề khác.

Và tôi đã xóa hai cột được tính toán cuối cùng:

    DETL_CLMNS_HASH "ORA_HASH( :t4||:t7 )",
    KEY_CLMNS_HASH "ORA_HASH(:t1||:t2||:t5)")

ORACLE_LOADER người lái xe không cho phép các thao tác như vậy; SQL * Loader thì có nhưng chúng không hoàn toàn giống nhau. Bạn cũng không thể xác định các cột ảo trên một bảng bên ngoài. Nếu bạn đang sử dụng bảng này như một bảng dàn để tải dữ liệu vào một bảng (thực) khác thì bạn có thể tính toán các hàm băm đó trong quá trình chuyển; nếu không, bạn có thể tạo chế độ xem trên bảng bên ngoài này bao gồm các cột được tính toán.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. max (rowid) trong oracle là gì

  2. Cách lặp qua danh sách được phân tách trong Oracle PLSQL

  3. Nhà phát triển SQL tinh chỉnh chế độ xem kết nối

  4. Tương đương với REF CURSOR của Oracle trong MySQL khi sử dụng JDBC là gì?

  5. Làm cách nào để kết nối với Cơ sở dữ liệu Oracle bằng cx_Oracle với tên dịch vụ và thông tin đăng nhập?