过程中外部表的动态目录(oracle)

时间:2017-09-04 13:31:34

标签: sql oracle stored-procedures plsql

我在pl sql中使用以下过程

       CREATE OR REPLACE PROCEDURE LOAD ( file_path VARCHAR2)
    AS
    BEGIN
    EXECUTE IMMEDIATE 'CREATE OR REPLACE DIRECTORY ext_tab_data AS '''||file_path||''' ';
    EXECUTE IMMEDIATE '
    CREATE TABLE DUMMY
     (
         col1      VARCHAR2(2000),
         col2     VARCHAR2(2000)
    ) 
    ORGANIZATION EXTERNAL
       (
             TYPE oracle_loader
             DEFAULT DIRECTORY ext_tab_data
             ACCESS PARAMETERS 
             (
                   RECORDS DELIMITED BY NEWLINE
                   badfile ext_tab_data:''bad_file.bad''
                   logfile ext_tab_data:''logs.log''
                    RECORDS DELIMITED BY NEWLINE
                   (FIELDS TERMINATED BY '','')
                   MISSING FIELD VALUES ARE NULL
                   ( 
                             col1  CHAR ,
                             col2  CHAR  

             ))
                 LOCATION (''F1.txt'')
    )REJECT LIMIT UNLIMITED;';
    END;

/
EXEC LOAD('C:\Users\external_table_new');

但这不起作用,我收到此错误

exec load
Error report -
ORA-00922: missing or invalid option
ORA-06512: at "SYSTEM.LOAD", line 7
ORA-06512: at line 1
00922. 00000 -  "missing or invalid option"
*Cause:    
*Action:

oracle立即执行。任何人都可以帮忙吗?我希望通过传递参数来运行过程时动态添加目录名称。

1 个答案:

答案 0 :(得分:1)

动态SQL语句不应以分号结束。从执行立即执行中的;语句中删除最后一个create table

您可能还想研究使用替代引用语法。这将允许您包含动态SQL,而不必进行转义。

例如:

execute immediate q'[
   create table dummy ...
   ...
                   badfile ext_tab_data:'bad_file.bad'
   ...
    )REJECT LIMIT UNLIMITED
]';