2017-04-07 78 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');