2017-09-04 40 views
0

我使用下面的過程中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: 

神諭立即執行。任何人都可以幫忙嗎?我希望在通過傳遞參數運行過程時動態添加目錄名稱。

+0

創建目錄動態似乎是一個奇怪的要求。當你做'創建目錄...'時,該目錄的文件路徑必須可供服務器使用。你真的添加/更改可用於服務器的目錄嗎?通常,您可以創建少量目錄(例如,一個用於輸入文件,一個用於輸出等,或者一個用於typeA文件,另一個用於typeB文件等),然後將文件移動到相關目錄中。我很好奇你爲什麼需要在Oracle中動態創建目錄? – Boneist

+0

謝謝你的答覆boneist ..ya這就是我想要的。在一個單獨的過程中是可能的,還是應該創建另一個過程(用於目錄)並從中調用該加載過程?因爲我無法將兩種說法都變成單一程序......所以你有什麼解決辦法! – steve

+0

首先,不要在SYSTEM模式(或SYS)中創建對象等 - 您應該創建一個新的模式來執行此操作。 (我這樣說,因爲SYS和SYSTEM是「特殊」模式,你可能會從它們中獲得意想不到的副作用)。就目前來看,它看起來問題在於你的create table語句。 – Boneist

回答

1

動態SQL語句不應以分號結尾。從即時執行中的create table語句中刪除最後的;

您可能還想使用替代引用語法進行研究。這將允許您包含動態SQL,而不會有太多的轉義。

例如:

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