有两套结构一样的表,用view来实现切换,如下:
第一套: tableA_1, tableB_1
第二套: tableA_2, tableB_2view:  viewA : create viewA as select * from tableA_1
       viewB:   create viewB as select * from tableB_1现在要把view 切换到第二套表:
view:  viewA : create viewA as select * from tableA_2
       viewB:   create viewB as select * from tableB_2怎么做到上面的ddl在事务中阿? 比如create viewB失败就回滚viewA.

解决方案 »

  1.   


    DDL语句是自动commit的,不知道是否可以回滚!没有具体实现过!
      

  2.   

    DDL是不能回滚的。viewb失败了,则去drop viewa  这样能实现你的需求。
      

  3.   

    没听说可以回滚 而且ddl还会在执行之前自动commit 要十分小心
      

  4.   

    ddl是自动提交,失败了它自己的会回滚
      

  5.   

    如果创建不成功就没有创建任何对象,不需要回滚DDL无法回滚的
      

  6.   

    建议不要把DDL放到事物里面。
      

  7.   

    ddl如果失败了,就不会操作成功,如果成功了就会自动commit没有办法回滚.
    而且注意的是,不要在一个事务中使用ddl语句,因为(如果ddl操作成功)会自动提交它之前的所有操作。
      

  8.   

    ddl语句在执行完毕以后自动提交。不能对DDL语句回滚
      

  9.   

    ddl不能回滚,你可以改成create or replace view
      

  10.   

    DDL 自动提交,
    还是自己查看命令是否执行成功,判断返回值?
      

  11.   

    建议如下:
    给你写一下DDL的伪代码:
    begin
    commit;
    ddl语句;
    commit;
    exception
    when others then 
    rollback;
    end;
    看到这个我想你应该明白DDL是不能回滚的 除非恢复或是FLSEBACK
    如果想在事务中加DDL语句,最好是用自治事务
      

  12.   


    这里需要说明一下,在DDL语法正确的情况下,无论语句是否执行成功,前面的事务都会自动提交无法再回滚,只有当DDL语句语法不正确的情况下才不会提交前面的事务,比如alter table tt add select number,因为字段名使用了关键字而触发语法错误,但以下语句虽然可能会执行失败,但仍然会提交之前的事务:alter table tt modify ss number,假如该列之前是字符类型并且包含不为空的行则执行将失败,但前面的事务也无法回滚,失败有这两种情况,结果却是不一样的!