最近,我学习oracle9i时把从Sql server2000上的程序移植到oracle9i上, 可是确发现一个很大问题, 那就是oracle的DDL语句自动提交事务.
   
   以前在sql server2000中,以下代码在一个事务中实现, 而且运行良好. 
   
伪码如下:
   事务开始;
   从相关表中取得一个编号n, 并保存这个编号;
   从一个没有数据的模板表t_templ创建一个表t_templ_n;
   为t_templ_n创建索引;
   向表中插入一些数据;
   提交事务;   如果在执行过程中出现什么错误, 就回滚事务. 在sql server中可以正确到回滚到事务开始时的状态.
但在oracle中就不行了, 创建表之后即使后面的操作失败,事务回滚也不能把表删除.当然我可以自己在事务失败时取删除那个表,但我感觉这样做不够安全, 而且也很麻烦.
   请各位大侠指点迷津, 您在这种情况下怎么做? 或者有没有什么办法可以回滚那个表?
   小弟 先 谢谢 各位了!!!

解决方案 »

  1.   

    ddl语句运行后oracle会自动提交,之前的事务就不能回滚了,这个时候只能麻烦点了,rollback的时候先删除索引和表例如下面的情况:insert into test_a  values(11,22,33); -- 已提交,不能回滚到这里truncate table temp;  --ddl语句,运行完会自动提交,前面的语句无法回滚insert into test_a  values(44,55,66); -- 只能回滚到这里插入之前的数据rollback;
      

  2.   

    这个在Oracle中没有办法回滚对于你的这种需求,可否考虑用 临时表
      

  3.   

    ddl语句都是隐式提交的,没法回滚