在 Oracle 过程中创建外部表
Creating external tables in Oracle procedure
我正在使用 Oracle 11g,但在过程中创建外部 table 时遇到了问题。它创建时没有错误,但是当我执行该过程时出现错误。
第一个参数是文件名,第二个参数是逗号,因为我在使用单引号将逗号括起来时遇到问题,其中我指定了以部分结尾的字段。 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
任何帮助将不胜感激。
您只能绑定 变量 ,并且外部 table 创建语法需要您尝试绑定的元素的文本文字。
您必须改为使用串联:
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.
因为我已经将连接的字符串值周围的单引号转义了。在您提到的问题中,您只传递逗号是因为您是 "having issues with using single quotations to surround the comma";通过将它们加倍来逃避它们是做到这一点的方法,所以如果你总是想要一个逗号分隔符,你可以这样做:
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');
但是,即时创建(并可能删除)对象通常不是一个好主意。最好创建一次外部 table,这将通过静态 DDL 完成:
CREATE TABLE LOAD
(
USERNAME VARCHAR2(30)
)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY DATA_DIR
ACCESS PARAMETERS
(FIELDS TERMINATED BY ',')
LOCATION ('dummy')
);
然后只需更改 table 以静态地拥有一个新文件名:
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');
我正在使用 Oracle 11g,但在过程中创建外部 table 时遇到了问题。它创建时没有错误,但是当我执行该过程时出现错误。
第一个参数是文件名,第二个参数是逗号,因为我在使用单引号将逗号括起来时遇到问题,其中我指定了以部分结尾的字段。 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
任何帮助将不胜感激。
您只能绑定 变量 ,并且外部 table 创建语法需要您尝试绑定的元素的文本文字。
您必须改为使用串联:
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.
因为我已经将连接的字符串值周围的单引号转义了。在您提到的问题中,您只传递逗号是因为您是 "having issues with using single quotations to surround the comma";通过将它们加倍来逃避它们是做到这一点的方法,所以如果你总是想要一个逗号分隔符,你可以这样做:
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');
但是,即时创建(并可能删除)对象通常不是一个好主意。最好创建一次外部 table,这将通过静态 DDL 完成:
CREATE TABLE LOAD
(
USERNAME VARCHAR2(30)
)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY DATA_DIR
ACCESS PARAMETERS
(FIELDS TERMINATED BY ',')
LOCATION ('dummy')
);
然后只需更改 table 以静态地拥有一个新文件名:
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');