トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

3-10 SCNと、コミット時刻を求める

SQLパズル

SCNテーブルの各行の、
SCNと、コミット時刻を求める


データ作成スクリプト

create table SCNテーブル(ID number(2));

begin
    for i in 1..50 Loop
        insert into SCNテーブル values(i);
    end Loop;
    commit;
end;
/


SQL

select ID,Ora_RowSCN,
to_char(SCN_To_TimeStamp(Ora_RowSCN),'yyyy/mm/dd HH24:mi:ss') as コミット時間
from SCNテーブル
order by ID;


解説

Ora_RowSCN擬似列を使うと、
行が最後にコミットされた時間が、
TimeStamp型で取得できます(Oracle10gからの新機能)

フラッシュバッククエリでデータを復旧する時や、
行の更新時間を調べる時に使えます

ただし、rowDependencies指定でcreateしてない表の場合、
SCNが取得できる粒度は行ではなくブロックとなります。
また、scn_to_timestampがtimestamp変換できるSCNには、下限があり、
限度を超えた大過去のSCNを引数に実行するとORA-08181でエラーとなります。

行を問わない最後の更新日を求めるなら
このクエリが使えるかもしれません。
select distinct Ora_RowSCN,
to_char(SCN_To_TimeStamp(Ora_RowSCN),'yyyy/mm/dd HH24:mi:ss') as LastCommitTime
from SCNテーブル
where Ora_RowSCN = (select max(Ora_RowSCN) from SCNテーブル);