2017-04-07 6 views
0

Oracle 11gを使用していますが、プロシージャ内に外部表を作成する際に問題があります。エラーなしで作成されますが、プロシージャを実行するとエラーが発生します。Oracleでの外部表の作成手順

最初のパラメータはファイルの名前で、2番目はコンマです。セクションで終わるフィールドを指定するコンマを囲むのに一重引用符を使用することに問題があったためです。 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; 

これは、私はこれは私がすべてのヘルプが理解されるであろう

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

を取得するとエラーになり

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

プロシージャを呼び出す方法です。

答えて

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

をただし、作成(そしておそらく落下)フライが一般的ではありません上のオブジェクト良い考え。静的にあまりにも新しいファイル名を持っているだけで、テーブルを変更し、その後

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

と:静的DDLで行われるであろう、一度外部表を作成する方が良いだろう

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