我写一简单脚本如下:
begin
  execute immediate 'create table tb(id int)';
  insert into tb values(1);
end;
/
执行时会提示表或视图不存在,后来修改如下:
declare
v_num float;
begin
   execute immediate 'create table tb(id int)';
   --下面for循环会执行10秒以上
   v_num:=1.234566;
     for i in 1..100000 loop
    v_num:=cos(v_num);
    end loop;
   insert into tb values(1);
end;
/
执行后仍然提示表或视图不存在
请问是否是因为execute immeditate 与DML有运行优先级的不同?
还是因为其它原因?execute immediate

解决方案 »

  1.   

    了解 动态sql和静态sql的 检查顺序 就差不多搞清楚了
      

  2.   

    你的语句在编译的时候会检查到 tb 表不存在,直接就提示表或视图不存在了,根本就没有执行。 如果改成begin
      execute immediate 'create table tb(id int)';
      execute immediate 'insert into tb values(1)';
      commit;
    end;应该就没问题了
      

  3.   

    学习了 我就是遇到了这个问题。我是先把这个表建出来,然后在存储过程中 执行execute immediate 'drop table tb(id int)',再执行execute immediate 'create table tb(id int)' 有点取巧的感觉。