【问题标题】:Oracle EXECUTE IMMEDIATE Not doing what expected in stored procedureOracle EXECUTE IMMEDIATE 未执行存储过程中的预期操作
【发布时间】: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;

它编译并工作。

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

谢谢

【问题讨论】:

    标签: oracle


    【解决方案1】:

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

    您的选择:

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

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

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

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

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

    【讨论】:

    • 在我们存储的 SP 创建脚本中,我们专门创建和删除所需的表,以消除对这种动态 SQL 的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2015-10-07
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多