我有 2  个 execute immediate 语句 
如下
execute immediate 'drop table substation';
       
vtest := 1/0;
execute immediate 'create table substation as select * from test121';
commit;
exception
  when others then
  rollback ;在 vtest := 1/0; 处出错的时候事务回滚,但是substation  还是 被drop 了,
不要vtest := 1/0; 这句话,如果后面一句
execute immediate 'create table substation as select * from test121'; 出错 事务回滚
substation  还是 被drop 了.求问如果达到 create table 失败以后不做drop table操作的效果.
以上操作在存储过程里面完成   

解决方案 »

  1.   

    create table 不能会滚
    when others then 
      drop table 。。; 
      

  2.   

    像DROP这种DDL语句是自动提交的...
    至少我不知道如何回滚DDL。create table substation as select * from test121这种语句除非表test121不存在,我实在想不出还会出什么错。
    万一怕错,先建个substation1试一下,成功了再DROP substation,CREATE substation1。当然我不推荐这种怪异的方法。
      

  3.   

    改成这样问题解决execute immediate 'delete  from substation';
           
           vtest:=0;
           vtest := 1/0;
           execute immediate 'insert into substation select * from test1';
           commit;
           exception
                  when others then
                   rollback;
                   return;
    为何,求教.
      

  4.   

    drop ,create 一旦创建或删除就回退不了。。
    不过10g 好像有个fash rollback功能可以回退drop的操作
      

  5.   

    delete和insert是DML
    可以回滚
      

  6.   

    1,2 楼给了我一些提示.
    在网上找了下资料如下大家分享Oracle中DDL语句对事务的影响
        在Oracle中,执行DDL语句(如Create Table、Create View等)时,会在执行之前自动发出一个Commit命令,并在随后发出一个Commit或者Rollback命令,也就是说,DDL会象如下伪码一样执行:
    Commit;
    DDL_Statement;
    If (Error) then
    Rollback;
    Else
    Commit;
    End if;我们通过分析下面例子来看Oracle中,DDL语句对事务的影响:
    Insert into some_table values(‘Before’);
    Creaate table T(x int);
    Insert into some_table values(‘After’);
    Rollback;
        由于在Oracle执行Create table语句之前进行了提交,而在Create table执行后也会自动发出Commit命令,所以只有插入After的行被回滚,而插入Before的行不会被回滚,Create table命令的结果也不会被回滚,即使Create table语句失败,所进行的Before插入也会被提交。如果最后发出Commit命令,因为插入Before及Create table的操作结果已经在之前提交,所以Commit命令影响的只有插入After的操作。