通过立即执行创建表不起作用

Posted

技术标签:

【中文标题】通过立即执行创建表不起作用【英文标题】:create table via execute immediate does not work 【发布时间】:2016-05-31 19:03:54 【问题描述】:

我在使用下面的 PLSQL 块时遇到问题。当代码执行如下(没有循环)时,脚本成功。但是,当未注释循环时,我收到一个错误,即未找到 select 语句中的表。当我检查时,我发现该表确实根本没有创建。就好像循环试图在立即执行之前运行一样。

是的,我知道由于无论如何都没有填充表,因此打印语句不会出现,但是我不希望查询失败。

begin
    execute immediate 'create table tbl_temp (oid_value number(20) ,rowid_field varchar2(20))';

    /*for nullval in (select oid_value from tbl_temp)
    loop
        DBMS_OUTPUT.PUT_LINE('something');
    end loop;*/
end;

【问题讨论】:

除了创建这样的表不是一个好主意之外,问题还在于时间。您正在 EXECUTE IMMEDIATE 中创建表。游标循环在编译时验证,在任何执行发生之前。所以在代码运行的时候,表是不存在的。 如果你有两个开始和两个结束,它可能会起作用。一次执行,一次循环。 有些人可能想知道为什么这是一个像 HepC 提到的不好的做法。贾斯汀洞穴对这个问题的回答回答了这个问题:***.com/questions/15827184/… 更具体地说,PL/SQL 是一种编译语言。这不仅仅是验证失败,当引用的对象不存在时,它根本无法编译。 【参考方案1】:

当您尝试运行此代码时,Oracle 首先检查它是否正确,从而检查它使用的所有表是否存在。

一开始你的表不存在,所以这段代码会报错,什么都不做。

如果您想动态创建一个表然后对其进行查询(我相信这不是一个好主意),您可以使用基于动态 SQL 的游标;例如:

SQL> select * from tbl_temp;
select * from tbl_temp
              *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> declare
  2      cur sys_refcursor;
  3      val number(20);
  4  begin
  5      execute immediate 'create table tbl_temp (oid_value number(20) ,rowid_field varchar2(20))';
  6
  7      open cur for 'select oid_value from tbl_temp';
  8      loop
  9          fetch cur into val;
 10          exit when cur%notfound;
 11          dbms_output.put_line('val = ' || val);
 12      end loop;
 13  end;
 14
 15
 16  /

PL/SQL procedure successfully completed.

SQL> select * from tbl_temp;

no rows selected

SQL>

【讨论】:

以上是关于通过立即执行创建表不起作用的主要内容,如果未能解决你的问题,请参考以下文章

插入蜂巢表不起作用

将存储过程数据插入临时表不起作用

pgadmin 4 导入/导出表不起作用

Cassandra中的数据建模简单表不起作用

带有 Ajax + 数据表的 CRUD 表不起作用

在搜索循环中设置变量列通过工作表不起作用,