【问题标题】:dynamic directory for external table in procedure (oracle)过程中外部表的动态目录(oracle)
【发布时间】: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


【解决方案1】:

动态 SQL 语句不应以分号结尾。从立即执行中的create table 语句中删除最后一个;

您可能还想研究使用替代引用语法。这将允许您包含动态 SQL 而不会进行太多转义。

例如:

execute immediate q'[
   create table dummy ...
   ...
                   badfile ext_tab_data:'bad_file.bad'
   ...
    )REJECT LIMIT UNLIMITED
]';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2020-10-08
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多