我遇到了下面的PLSQL块问题。当代码执行如下所示(没有循环)时脚本成功。但是当取消注释循环时,我得到一个错误,即找不到select语句中的表。当我检查时,我发现确实没有创建表。这几乎就像循环尝试在执行立即执行之前运行。
是的我知道,由于表格没有填充,无论如何都不会出现print语句,不管我不希望查询失败。
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;
答案 0 :(得分:4)
当您尝试运行此代码时,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>