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

时间:2016-05-31 19:03:55

标签: sql oracle plsql oracle11g

我遇到了下面的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;

1 个答案:

答案 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>