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

Oracle EXECUTE IMMEDIATE未执行存储过程中预期的操作,oracle,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'

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

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

...
...
...
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:表或视图不存在

但是,

如果我移除

从mytable中选择COUNT(*)到c

它编译并运行

请就可能是非常简单的解决方案提出建议


谢谢

当Oracle编译存储过程时,它会检查是否存在
mytable
。如果
mytable
在编译时不存在,它将给您一个错误

您的选择:

  • 提前创建表格
  • 您无法使用动态SQL(
    executeimmediate
    )执行
    SELECT COUNT(*)…
    ,就像您已经在执行
    INSERT
    语句一样
  • 请注意,如果您决定使用第二个选项,则可以将查询结果分配给
    c
    变量,如下所示:

    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM mytable' INTO c;
    
    但是,在存储过程中混合使用DDL语句和查询通常不是一个好主意,因为:

  • 它迫使您走上动态SQL的道路,而动态SQL很容易被破坏
  • 您无法编写正确的事务存储过程,因为每个DDL语句都执行隐式的
    commit

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