对表进行了3个插入,然后一起commit
insert into yan_test values('11');
insert into yan_test values('22');
insert into yan_test values('33');
commit;然后我认为这个事务是错误的,希望flashback,取消这个事务
select versions_startscn,versions_endscn,versions_starttime,versions_endtime, versions_xid,versions_operation,ftelno from yan_test versions between timestamp minvalue and maxvalue
得到的结果是:
3条记录,3条记录的xid均是000C000300161D38
通过这个xid去找undo_sql
select undo_sql from FLASHBACK_TRANSACTION_QUERY where  xid=HEXTORAW('000C000300161D38')
得到的结果是:
delete from "YAN_TEST" where ROWID = 'AAAX+oAAGAAGaqFAAB';但是这条语句只是删除值为“11”的那条记录,也就是事务开始的第一条记录,另外2条记录的如何flashback?

解决方案 »

  1.   

    等待高手指点,网上其它资源都没有提到一个 事务中多条记录flashback的问题
      

  2.   


    SQL> create table yan_test (f1 varchar2(20));Table created.SQL> insert into yan_test values('11');1 row created.SQL> c/11/22
      1* insert into yan_test values('22')
    SQL> /1 row created.SQL> c/22/33
      1* insert into yan_test values('33')
    SQL> /1 row created.SQL> commit;SQL> select  versions_startscn, versions_endscn, versions_starttime, versions_endtime, versions_xid,
      2  versions_operation, f1 from yan_test versions between timestamp minvalue and maxvalue;VERSIONS_STARTSCN VERSIONS_ENDSCN VERSIONS_STARTTIME
    ----------------- --------------- ---------------------------------------------------------------------------
    VERSIONS_ENDTIME                                                            VERSIONS_XID     V F1
    --------------------------------------------------------------------------- ---------------- - --------------------
             15932185                 11-FEB-10 12.31.52 PM
                                                                                090008009A1D0000 I 33         15932185                 11-FEB-10 12.31.52 PM
                                                                                090008009A1D0000 I 22         15932185                 11-FEB-10 12.31.52 PM
                                                                                090008009A1D0000 I 11
    SQL> select undo_sql from flashback_transaction_query where xid = hextoraw('090008009A1D0000');UNDO_SQL
    -------------------------------------------------------------------------------------------------------------------
    delete from "HR"."YAN_TEST" where ROWID = 'AAAURIAAEAAB4wGAAC';
    delete from "HR"."YAN_TEST" where ROWID = 'AAAURIAAEAAB4wGAAB';
    delete from "HR"."YAN_TEST" where ROWID = 'AAAURIAAEAAB4wGAAA';我做了實驗,得出有3條undo_sql記錄。
      

  3.   


    SQL> select f1, rowid from yan_test;F1                   ROWID
    -------------------- ------------------
    11                   AAAURIAAEAAB4wGAAA
    22                   AAAURIAAEAAB4wGAAB
    33                   AAAURIAAEAAB4wGAAC
      

  4.   

    如nGX20080110所示,我也得到同样的结果,问下,楼主你的oracle数据库是否是altp系统库啊?楼主在本地用测试库(自己单独一个人用的库)试下看效果如何?
      

  5.   

    只出现一条delete语句,是由于insert有没有立即去查undosql,而是过了一段时间去查的,此种情况下,确实只显示一条delete语句。