Flashback Data Archive機能を利用して、過去データの参照、及び過去データへのフラッシュバックを行なってみましょう。

SQL> SELECT empno,ename,sal FROM emp
  2  WHERE ename = 'SMITH';

     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH             800


Archiveを有効にしたemp表を利用します。
SMITHの給与(SAL)は800です。

SQL> UPDATE emp
  2  SET sal = sal + 1000
  3  WHERE ename = 'SMITH';

1行が更新されました。

SQL> commit;

コミットが完了しました。


SMITHの給与を3回、+1000します。

SQL> SELECT empno,ename,sal FROM emp
  2  WHERE ename = 'SMITH';

     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH            3800


給与が更新されたことを確認します。

SELECT empno,ename,sal FROM emp
AS OF TIMESTAMP
(SYSTIMESTAMP - INTERVAL '10' MINUTE)
WHERE ename = 'SMITH';

     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH             800


emp表はArchiveを有効にしているので過去データを参照可能です。
「(SYSTIMESTAMP - INTERVAL '10' MINUTE)」で10分前のデータを参照します。
更新前の給与が表示されていることを確認できます。

SQL> explain plan for
  2  SELECT empno,ename,sal FROM emp
  3  AS OF TIMESTAMP
  4  (SYSTIMESTAMP - INTERVAL '10' MINUTE)
  5  WHERE ename = 'SMITH';

解析されました。

SQL> @$ORACLE_HOME/rdbms/admin/utlxpls

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2504078639

----------------------------------------------------------------------------------------------------------------
| Id  | Operation                 | Name               | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |                    |     2 |    66 |   285   (1)| 00:00:01 |       |       |
|   1 |  VIEW                     |                    |     2 |    66 |   285   (1)| 00:00:01 |       |       |
|   2 |   UNION-ALL               |                    |       |       |            |          |       |       |
|*  3 |    FILTER                 |                    |       |       |            |          |       |       |
|   4 |     PARTITION RANGE SINGLE|                    |     1 |    61 |   274   (0)| 00:00:01 |   KEY |     1 |
|*  5 |      TABLE ACCESS FULL    | SYS_FBA_HIST_92153 |     1 |    61 |   274   (0)| 00:00:01 |   KEY |     1 |

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|*  6 |    FILTER                 |                    |       |       |            |          |       |       |
|   7 |     MERGE JOIN OUTER      |                    |     1 |  2054 |    11  (19)| 00:00:01 |       |       |
|   8 |      SORT JOIN            |                    |     1 |    26 |     7  (15)| 00:00:01 |       |       |
|*  9 |       TABLE ACCESS FULL   | EMP                |     1 |    26 |     6   (0)| 00:00:01 |       |       |
|* 10 |      SORT JOIN            |                    |     1 |  2028 |     4  (25)| 00:00:01 |       |       |
|* 11 |       TABLE ACCESS FULL   | SYS_FBA_TCRV_92153 |     1 |  2028 |     3   (0)| 00:00:01 |       |       |
----------------------------------------------------------------------------------------------------------------


explainの解析データでflashback表を参照していることがわかります。

UPDATE emp
SET sal = (
SELECT sal FROM emp
AS OF TIMESTAMP
(SYSTIMESTAMP - INTERVAL '30' MINUTE)
WHERE ename = 'SMITH'
)
WHERE ename = 'SMITH';

1行が更新されました。


Archiveを利用して、現在の値を更新します。
つまりは、更新の取り消しです。

SQL> SELECT empno,ename,sal FROM emp
  2  WHERE ename = 'SMITH';

     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH             800


更新前の状態になったことを確認できました。