Oracle EXECUTE IMMEDIATE 未执行存储过程中的预期操作

Posted

技术标签:

【中文标题】Oracle EXECUTE IMMEDIATE 未执行存储过程中的预期操作【英文标题】:Oracle EXECUTE IMMEDIATE Not doing what expected in stored procedure 【发布时间】:2015-07-08 23:30:34 【问题描述】:

我有一个存储过程,其中有几个检查,但是下面的部分给了我立即执行的问题

例如,当我尝试使用以下语句编译过程时,它会抱怨表或视图不存在。

...
...
...
EXECUTE IMMEDIATE 'CREATE TABLE mytable(col1 number, col2 number, col3 number)';
EXECUTE IMMEDIATE 'INSERT INTO mytable (col1,col2,col3)
   SELECT a,b,c FROM source_table' ;

SELECT COUNT(*) INTO c FROM mytable;

6:18:22 [创建 - 0 行,0.000 秒] 50:29 PL/SQL:ORA-00942:表或视图不存在

然而,

如果我删除了

SELECT COUNT(*) INTO c FROM mytable;

它编译并工作。

请告知可能是一个非常简单的解决方案。

谢谢

【问题讨论】:

【参考方案1】:

当Oracle 编译存储过程时,它会检查mytable 是否存在。如果mytable 在编译时不存在,则会报错。

您的选择:

    提前创建表格。 您无法使用动态 SQL (EXECUTE IMMEDIATE) 执行您的 SELECT COUNT(*) ...,就像您已经在执行 INSERT 语句一样。

请注意,如果您决定使用第二个选项,则可以将查询结果分配给您的 c 变量,如下所示:

EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM mytable' INTO c;

但是,在存储过程中混合 DDL 语句和查询通常不是一个好主意,因为:

    它迫使您走上动态 SQL 的道路,这很容易中断。 您无法编写正确的事务性存储过程,因为每个 DDL 语句都会执行隐式 commit

【讨论】:

在我们存储的 SP 创建脚本中,我们专门创建和删除所需的表,以消除对这种动态 SQL 的需求。

以上是关于Oracle EXECUTE IMMEDIATE 未执行存储过程中的预期操作的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中动态SQL详解(EXECUTE IMMEDIATE)

ORACLE EXECUTE IMMEDIATE 小结

mariadb 10.2.3支持oracle execute immediate语法

oracle 中execute immediate作用

Oracle PL SQL - EXECUTE IMMEDIATE 的问题

在 Oracle 中使用 Execute Immediate 将数据插入表中