通过立即执行创建表不起作用
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>
【讨论】:
以上是关于通过立即执行创建表不起作用的主要内容,如果未能解决你的问题,请参考以下文章