是否可以在 PLSQL/Oracle 中动态创建外部表

Posted

技术标签:

【中文标题】是否可以在 PLSQL/Oracle 中动态创建外部表【英文标题】:Is it possible to Dynamically Create External tables in PLSQL/Oracle 【发布时间】:2014-08-12 08:07:06 【问题描述】:

我目前遇到了一些麻烦,我正在尝试从 CSV 文件中动态提取值并动态创建外部表,因为每个 CSV 文件每次都会有不同数量的标题。

有没有办法动态地做到这一点,我所做的研究告诉我你不能,但如果你可以的话,通过 oracle 线程将非常困难,而且我也没有任何运气来实现这个功能。

有没有人尝试过或者有经验可以提供一些帮助或建议?

我当前的脚本:

DROP TABLE TEST_CSV CASCADE CONSTRAINTS;

CREATE TABLE TEST_CSV
(
  VAL1  VARCHAR2(255 BYTE),
  VAL2  VARCHAR2(255 BYTE),
  VAL3  VARCHAR2(255 BYTE)
)
ORGANIZATION EXTERNAL
  (  TYPE ORACLE_LOADER
     DEFAULT DIRECTORY DATALOAD
     ACCESS PARAMETERS
       ( RECORDS DELIMITED BY NEWLINE
       FIELDS TERMINATED BY ","
       )
     LOCATION (DATALOAD:'test1.csv')
  )
REJECT LIMIT UNLIMITED;

【问题讨论】:

【参考方案1】:

您应该为此使用执行立即语句:

execute immediate 'DROP TABLE TEST_CSV CASCADE CONSTRAINTS';

等等…… 它与通常使用的命令没有任何区别。但是您可能会遇到一些权限问题。 Oracle 动态 sql 通常有一些错误,他的行为可能与普通 DDL 命令不同

【讨论】:

【参考方案2】:

是的,可以,您可以为外部表创建一个动态语句,然后执行该语句的 EXECUTE IMMEDIATE。也可以查看我一直使用的代码 Line:1400 和 Line:1419

Code

【讨论】:

【参考方案3】:

我建议你创建一个创建外部表的动态过程,这样你可以通过参数控制头部和目录。

注意,您应该在此动态过程中可能发生的所有情况之前考虑一下。

它有效,我以前做过。

任何问题都可以告诉我。

谢谢。

【讨论】:

以上是关于是否可以在 PLSQL/Oracle 中动态创建外部表的主要内容,如果未能解决你的问题,请参考以下文章

plsql oracle如何不允许员工的奖金大于总量的0.1%?

如何从 PLSQL Oracle 过程中删除数据或清空游标?

plsql Oracle 中文字段 查不出来

plsql oracle 使用教程

PLSQL/Oracle 如何“映射”/“规范化”数字

PLSQL ORACLE:表变量之间的内连接