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_name
và DATAFILE
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.