在PLSQL中执行了EXECUTE IMMEDIATE 'RENAME 旧表名 TO 新表名' 改变了表名。
如果在后续的其他操作中操作中出现错误,能将表名回滚吗?如何回滚?CREATE OR REPLACE PROCEDURE TEST
IS    
BEGIN
    EXECUTE IMMEDIATE 'RENAME test_01 TO test_02';
    ROLLBACK;
END;
/
这个方法不行,不知道有没有其他方法?

解决方案 »

  1.   

    FLASHBACK TABLE语句可以做到.Rollback已经不可以了。
      

  2.   

    回复:Croatia
    一个表改名的情况下可以用FLASHBACK TABLE 闪回吗? 请问语句怎么写?
    用dbms_flashback.enable_at_time()是不是如果期间有其他用户的操作也全部被恢复了?
      

  3.   

    楼主,你执行的是DDL语句,是不可以执行ROLLBACK 的.
      

  4.   

    如果用dbms_flashback.enable_at_time()来执行恢复,则必须要存在归档日志,并且执行这样的语句,也是数据库的不完全恢复,要注意使用.如果楼主的DML语句都执行失败了的话,也就是表示数据库系统并没有将更改的数据写入数据文件,所以,按照楼主所执行的语句,数据库系统实质上只修改了表名(DDL)那一句.因此,楼主完全不需要执行数据库表的闪回操作,只需要再次执行RENAME语句修改表名即可.
      

  5.   

    楼主,怎么在执行语句之后,直接就rollback了,至少应该来一个判断吧,不然成功于否有什么区别?
    最笨的办法:
    再将名字改回来
    EXECUTE IMMEDIATE  'RENAME test_02 TO test_01 ';
      

  6.   

    不要用enable_at_time(),直接使用为drop准备的。
      

  7.   

    其实,LZ考虑过,假如失败了,失败的原因是什么呢?赫赫。
    你可以把你执行成功的语句,保存到一个变量里面,或者数组之类的。
    在处理出错的时候,把他们恢复回去。
    rename是默认执行commit的语句。rollback是倒不回来的。
    用到系统日至来恢复,也是一个方法。就是用起来也比较繁。
    所以,我给了你
    FLASHBACK TABLE tablename1 TO BEFORE DROP RENAME TO tablename2;
    这样的思考路子。他是对drop table 语句有效的。
    对rename 的语句,我确认一下,看看可不可以。(我记得好像是可以的。)