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)
mariadb 10.2.3支持oracle execute immediate语法