【问题标题】:Oracle Apex 4.2.2: Import csv via button and dynamic actionOracle Apex 4.2.2:通过按钮和动态操作导入 csv
【发布时间】:2013-06-03 12:01:57
【问题描述】:

我尝试将一些数据从 csv 导入表格。 csv 位于服务器上,我尝试将其复制到外部表以将其内容复制到主数据表。 如果没有这个错误,我什至无法保存代码:

PLS-00103:在预期以下情况之一时遇到符号“EXTERNAL”::=。 (@%;

它在 SQL Developer 中运行良好。

BEGIN
  EXECUTE IMMEDIATE'
  CREATE TABLE  "MY_TABLE_CSV" 
   (    "C1" VARCHAR2(255), 
    "C2" VARCHAR2(255), 
    "C3" VARCHAR2(255), 
    "C4" VARCHAR2(255), 
    "C5" VARCHAR2(255), 
    "C6" VARCHAR2(255), 
    "C7" VARCHAR2(255), 
    "C8" VARCHAR2(255), 
    "C9" VARCHAR2(255), 
    "C10" VARCHAR2(255), 
    "C11" VARCHAR2(255), 
    "C12" VARCHAR2(255), 
    "C13" VARCHAR2(255), 
    "C14" VARCHAR2(255), 
    "C15" VARCHAR2(255), 
    "C16" VARCHAR2(255), 
    "C17" VARCHAR2(255), 
    "C18" VARCHAR2(255), 
    "C19" VARCHAR2(255), 
    "C20" VARCHAR2(255)
   )';
   ORGANIZATION EXTERNAL
   (
     TYPE ORACLE_LOADER
     DEFAULT DIRECTORY SOME_FOLDER
     ACCESS PARAMETERS (
       records delimited BY newline
       fields terminated BY ';'
       optionally enclosed BY '"'
       lrtrim
       missing field VALUES are NULL
     )
   LOCATION ('foo.csv')
   );
END;

我工作的服务器在 Apex 4.2.2 上运行。

我已经尝试将其放入匿名块中。

提前致谢!

编辑:我之前也尝试过删除表,甚至不创建表,而只是删除它的内容。它永远不会起作用。

EDIT2:我更新了代码。还有错误消息。

【问题讨论】:

  • 您在列列表的末尾有一个虚假的引号)';,嵌入的引号没有被转义,并且您错过了 create table 命令末尾的结束引号。

标签: sql csv import plsql oracle-apex


【解决方案1】:

我必须使用 EXECUTE IMMEDIATE 函数 (Link To Oracle Docs)。我什至不得不使用'q'来确定“'”是引用。
工作代码现在如下所示:

BEGIN
  EXECUTE IMMEDIATE q'!
  CREATE TABLE  "MY_TABLE_CSV" 
   (    "C1" VARCHAR2(255), 
    "C2" VARCHAR2(255), 
    "C3" VARCHAR2(255), 
    "C4" VARCHAR2(255), 
    "C5" VARCHAR2(255), 
    "C6" VARCHAR2(255), 
    "C7" VARCHAR2(255), 
    "C8" VARCHAR2(255), 
    "C9" VARCHAR2(255), 
    "C10" VARCHAR2(255), 
    "C11" VARCHAR2(255), 
    "C12" VARCHAR2(255), 
    "C13" VARCHAR2(255), 
    "C14" VARCHAR2(255), 
    "C15" VARCHAR2(255), 
    "C16" VARCHAR2(255), 
    "C17" VARCHAR2(255), 
    "C18" VARCHAR2(255), 
    "C19" VARCHAR2(255), 
    "C20" VARCHAR2(255)
   )
   ORGANIZATION EXTERNAL
   (
     TYPE ORACLE_LOADER
     DEFAULT DIRECTORY SOME_FOLDER
     ACCESS PARAMETERS (
       records delimited BY newline
       fields terminated BY ';'
       optionally enclosed BY '"'
       lrtrim
       missing field VALUES are NULL
     )
   LOCATION ('foo.csv')
   )!';
END;

编辑:我每次都需要创建表,因为传入 *.csv 的数量是可变的。

【讨论】:

    【解决方案2】:

    为什么每次都想(重新)创建这个?当您创建了一个外部表定义时,您已设置:当您对其执行选择时,它所需要的只是一个文件。例如,如果文件在一夜之间发生变化,外部表仍然可以工作。

    至于您第一个错误的原因:CREATE TABLE 是 DDL。你不能把它放在 PL/SQL 块中。

    【讨论】:

    • 感谢@Tom 提供的信息。我阅读了EXECUTE IMMEDIATE 语句,通过更改表中的信息并创建表,这很有帮助。我将使用alter table myapp_schema.DATA_CSV location ( 'new_foo.csv' ) 命令更改外部表后面的 csv 信息。但是当涉及到ORGANIZATION EXTERNAL 时,我仍然遇到错误。 PLS-00103: Encountered the symbol "EXTERNAL" when expecting one of the following: := . ( @ % ;
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多