1  begin
2  execute immediate 'drop table T purge';
3  execute immediate 'create table T as select  * from b where id<=100';
4  insert into T(id) values(101);
5  commit;
6  end;
a,假如 有建表T,且 把第2句“execute immediate 'drop table T purge';”  删除,
则代码执行到第4句时就报错:“表T不存在”,
可在第3句时明明是建好表了啊
为什么?
b,为什么在执行上述代码之前
一定要建好表T?

解决方案 »

  1.   

    不是执行报错吧,应该是编译报错。解决方法,insert也改成动态语句。
      

  2.   

     begin
     execute immediate 'drop table T purge';
     execute immediate 'create table T as select  * from b where id <=100';
     execute immediate 'insert into T(id) values(101)';
     commit;
     end; 
      

  3.   

      begin 
      --execute immediate 'drop table T purge'; 
      execute immediate 'create table T as select  * from b where id <=100'; 
      execute immediate 'insert into T(id) values(:1)' using '101'; 
      commit; 
      end;
    你不把T表建好,怎么插入数据呀!!insert 到什么地方? 
      

  4.   

    因为你是动态建表的,在insert语句那里,编译器是找不到表T的,就会报表不存在,编译不通过。
    可以把insert语句也用动态,上面说的很清楚了
      

  5.   

    1  begin 
    2  execute immediate 'drop table T purge'; 
    3  execute immediate 'create table T as select  * from b where id <=100'; 
    4  execute immediate 'insert into T(id) values(101)'; 
    5  commit; 
    6  end; 
      

  6.   

    要么全部不用动态:1  begin 
    2  drop table T purge; 
    3  create table T as select  * from b where id <=100; 
    4  insert into T(id) values(101); 
    5  commit; 
    6  end;