Oracle Databaseには、過去のデータを参照する強力な機能「フラッシュバッククエリ(Flashback Query)」があります。
この記事では、SCNを使った方法に加え、日時を指定して過去のデータを参照する方法(AS OF TIMESTAMP)も補足として解説します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
◆ フラッシュバッククエリとは?
通常のSQLは、現在のデータに対して実行されますが、フラッシュバッククエリでは、指定した過去の時点のデータを参照できます。
「いつ」「どのように」データが変わったかを調査したいときにとても便利です。
◆ 使用する構文(SCN指定)
SELECT ... FROM テーブル名 AS OF SCN SCN番号;
たとえば、SCN「1234567」時点のEMP表の内容を確認したい場合は、以下のように記述します。
SELECT * FROM emp AS OF SCN 1234567;
◆ 実験:フラッシュバック問い合わせを試してみよう
以下のように、テスト用のテーブルを作成し、データ操作の前後でSCNを取得しながら実験してみましょう。
① テーブル作成・初期データ投入
CREATE TABLE emp_test (
empno NUMBER PRIMARY KEY,
ename VARCHAR2(10)
);
INSERT INTO emp_test VALUES (1001, 'TARO');
INSERT INTO emp_test VALUES (1002, 'JIRO');
COMMIT;
② 現在のSCNと日時を取得
SELECT dbms_flashback.get_system_change_number AS current_scn,
SYSTIMESTAMP AS current_time
FROM dual;
例:
CURRENT_SCN | CURRENT_TIME
------------+------------------------------
1234567 | 2025-03-22 15:01:00.000000 +09:00
このSCNや時刻をメモしておきます。
③ データの更新
UPDATE emp_test SET ename = 'SABURO' WHERE empno = 1002;
COMMIT;
④ フラッシュバッククエリで変更前のデータを参照
SCNを指定する場合:
SELECT * FROM emp_test AS OF SCN 1234567;
【補足】日時を指定する場合:
SELECT * FROM emp_test AS OF TIMESTAMP TO_TIMESTAMP('2025-03-22 15:01:00', 'YYYY-MM-DD HH24:MI:SS');
結果:
EMPNO | ENAME
------+--------
1001 | TARO
1002 | JIRO
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
◆ テキスト図:SCNや時間を使った過去参照のイメージ
時系列 ─────────────→
[SCN:1234567] [SCN:1234600]
[時:15:01:00] [時:15:02:00]
↓ ↓
+--------+ +--------+
| JIRO |更新後→| SABURO |
+--------+ +--------+
SELECT * FROM emp_test AS OF SCN 1234567;
SELECT * FROM emp_test AS OF TIMESTAMP '2025-03-22 15:01:00';
→ どちらも JIRO が見える!
SQL> CREATE TABLE emp_test (
2 empno NUMBER PRIMARY KEY,
3 ename VARCHAR2(10)
4 );
表が作成されました。
SQL> INSERT INTO emp_test VALUES (1001, 'TARO');
1行が作成されました。
SQL> INSERT INTO emp_test VALUES (1002, 'JIRO');
1行が作成されました。
SQL> SELECT * FROM emp_test;
EMPNO ENAME
---------- ------------------------------
1001 TARO
1002 JIRO
SQL> commit;
コミットが完了しました。
SQL> SELECT dbms_flashback.get_system_change_number AS current_scn FROM dual;
CURRENT_SCN
-----------
2283755 ★
SQL> UPDATE emp_test SET ename = 'SABURO' WHERE empno = 1002;
1行が更新されました。
SQL> SELECT * FROM emp_test;
EMPNO ENAME
---------- ------------------------------
1001 TARO
1002 SABURO
SQL> commit;
コミットが完了しました。
SQL> SELECT * FROM emp_test AS OF SCN 2283755; ★UPDATE前の時点のSCNを指定
EMPNO ENAME
---------- ------------------------------
1001 TARO
1002 JIRO
◆ 注意点
- フラッシュバッククエリは「UNDOデータ」を利用します。
- UNDO保持期間を過ぎると、SCNやTIMESTAMPを指定してもデータは取得できません(ORA-01555エラー)。
AS OF TIMESTAMPはタイムゾーンに注意してください(SYSTIMESTAMPの使用がおすすめ)。
◆ まとめ
| 項目 | 内容 |
|---|---|
| フラッシュバッククエリ | 過去のデータをSELECTで簡単に参照できる |
| AS OF SCN | 正確な変更時点を指定して調査できる |
| AS OF TIMESTAMP | 時刻ベースで人間に分かりやすく時点指定ができる |
| 注意点 | UNDOが保持されていないと参照できない可能性がある |
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント