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

时间:2015-07-08 23:30:35

标签: oracle

我有一个存储过程,其中包含多个检查,但是以下部分给出了执行立即

的问题

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

...
...
...
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 个答案:

答案 0 :(得分:2)

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

您的选择:

  1. 提前创建表格。
  2. 您使用动态SQL(SELECT COUNT(*) ...)执行EXECUTE IMMEDIATE时遇到困难,就像您已经为INSERT声明所做的那样。
  3. 请注意,如果您决定使用第二个选项,则可以将查询结果分配给c变量,如下所示:

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

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

    1. 它迫使你走下动态SQL的路径,这很容易破解。
    2. 您无法编写正确的事务存储过程,因为每个DDL语句都执行隐式commit
相关问题