【发布时间】:2017-09-04 13:31:33
【问题描述】:
我在 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:
oracle 立即执行。有人可以帮忙吗?我希望在通过传递参数运行过程时动态添加目录名称。
【问题讨论】:
-
动态创建目录似乎是一个奇怪的要求。当您执行
create directory ...时,该目录的文件路径必须对服务器可用。您是否真的添加/更改了服务器可用的目录?通常,您会创建少量目录(例如,一个用于输入文件,一个用于输出等,或者一个用于 typeA 文件,另一个用于 typeB 文件等),然后将文件移动到相关目录中。我很好奇为什么需要在 Oracle 中动态创建目录? -
感谢boneist 的回复 ..ya 这就是我想要的。是否可以在单个过程中或我应该创建另一个过程(用于目录)并从中调用此加载过程?因为我无法将这两个语句都执行到一个过程中......所以你有什么解决方案!
-
首先,不要在 SYSTEM 模式(或 SYS 中)创建对象等 - 您应该创建一个新模式来执行此操作。 (我这么说是因为 SYS 和 SYSTEM 是“特殊”模式,你可能会因为在它们中开发而得到意想不到的副作用。)。就目前而言,问题似乎在于您的 create table 语句。
-
您真的,真的在运行此过程之前在服务器上添加/修改目录吗?因为这听起来非常非常奇怪,并且可能存在安全风险。
-
Yaboneist ...服务器将由我处理...别担心...给我解决方案..我会感谢你
标签: sql oracle stored-procedures plsql