2017-04-07 75 views
0

我正在使用Oracle 11g,並且遇到了在過程中創建外部表的問題。它被創建沒有錯誤,但是當我執行該過程時,我有錯誤。在Oracle過程中創建外部表

第一個參數是文件的名稱,第二個參數是逗號,因爲我在使用單引號環繞逗號時出現了問題,在該逗號中指定了由區段終止的字段。 DATA_DIR被聲明。

這是我的嘗試。

CREATE OR REPLACE PROCEDURE LOADTABLE 
(
    FILENAME VARCHAR2, 
    COMMA VARCHAR 
) 
AS 
BEGIN 

    EXECUTE IMMEDIATE 'CREATE TABLE LOAD 
    (
     USERNAME VARCHAR2(30) 
    ) 
    ORGANIZATION EXTERNAL 
    (
     TYPE ORACLE_LOADER 
     DEFAULT DIRECTORY DATA_DIR 
     ACCESS PARAMETERS 
     (FIELDS TERMINATED BY :COMMA) 
     LOCATION (:FILENAME) 
    )' USING IN COMMA, FILENAME; 
END; 

這是我如何調用該過程

EXEC LOADTABLE('username.csv',','); 

這是錯誤我得到

ERROR at line 1: 
ORA-00931: missing identifier 
ORA-06512: at "DATA_ADMIN.LOADTABLE", line 9 
ORA-06512: at line 1 

任何幫助將不勝感激。

回答

2

您只能綁定變量,並且外部表創建語法需要文本字面值爲您嘗試綁定的元素。

你將不得不使用的是串聯方法:

CREATE OR REPLACE PROCEDURE LOADTABLE 
(
    FILENAME VARCHAR2, 
    COMMA VARCHAR 
) 
AS 
BEGIN 
    EXECUTE IMMEDIATE 'CREATE TABLE LOAD 
(
    USERNAME VARCHAR2(30) 
) 
ORGANIZATION EXTERNAL 
(
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY DATA_DIR 
    ACCESS PARAMETERS 
    (FIELDS TERMINATED BY ''' || COMMA || ''') 
    LOCATION (''' || FILENAME || ''') 
)'; 
END; 
/

Procedure LOADTABLE compiled 

EXEC LOADTABLE('username.csv',','); 

PL/SQL procedure successfully completed. 

在,我已經逃過了串聯的字符串值周圍的單引號。在你提到的問題中,你只是通過了逗號,因爲你「在使用單引號括住逗號時遇到了問題」。通過他們,加倍逃避他們是做到這一點的方式,所以如果你總是希望一個逗號分隔符,你可以做,而不是:

CREATE OR REPLACE PROCEDURE LOADTABLE 
(
    FILENAME VARCHAR2 
) 
AS 
BEGIN 
    EXECUTE IMMEDIATE 'CREATE TABLE LOAD 
(
    USERNAME VARCHAR2(30) 
) 
ORGANIZATION EXTERNAL 
(
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY DATA_DIR 
    ACCESS PARAMETERS 
    (FIELDS TERMINATED BY '','') 
    LOCATION (''' || FILENAME || ''') 
)'; 
END; 
/

EXEC LOADTABLE('username.csv'); 

然而,創建(大概下降)對象上飛不是一般一個好主意。這將是更好的,一旦創建外部表,這將靜態DDL來完成:

CREATE TABLE LOAD 
(
    USERNAME VARCHAR2(30) 
) 
ORGANIZATION EXTERNAL 
(
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY DATA_DIR 
    ACCESS PARAMETERS 
    (FIELDS TERMINATED BY ',') 
    LOCATION ('dummy') 
); 

,然後就改變表有一個新的文件名靜態太:

alter table load location ('username.csv'); 

,或者你真的想要一個程序來做到這一點:

CREATE OR REPLACE PROCEDURE LOADTABLE 
(
    FILENAME VARCHAR2 
) 
AS 
BEGIN 
    EXECUTE IMMEDIATE 'ALTER TABLE LOAD LOCATION (''' || FILENAME || ''')'; 
END; 
/

EXEC LOADTABLE('username.csv');