web-dev-qa-db-ja.com

Oracleフラッシュバッククエリ構文-すべてのテーブルが同じタイムスタンプ

Oracle Flashback Queryの使用方法についてオンラインで多くの例を見つけることはできません。誰かが構文を明確にできるといいのですが。多数のテーブルを含むクエリを実行しようとしていますが、構文では、クエリに含まれるすべてのテーブルのタイムスタンプを指定する必要があるようです。

たとえば、次のクエリは一貫したデータを取得しますが、テーブルごとにタイムスタンプを指定する必要があります。

select t1.Field1, t2.Field2
  from table1 as of timestamp to_timestamp('2016-11-01 02:00:00','yyyy-mm-dd hh24:mi:ss') t1
  join table2 as of timestamp to_timestamp(2016-11-01 02:00:00','yyyy-mm-dd hh24:mi:ss') t2
    on t1.somekey = t2.somekey

次の例(ほとんどの例がオンラインで見える方法)は、table1の過去のデータを示していますが、table2の現在のデータに結合されています-それらは整列していません。

select t1.Field1, t2.Field2
  from table1 as of timestamp to_timestamp('2016-11-01 02:00:00','yyyy-mm-dd hh24:mi:ss') t1
  join table2 t2
    on t1.somekey = t2.somekey

テーブルが多数あるので、フラッシュバックタイムスタンプに対してクエリ全体を実行できる方法を期待しています-次のようなもの:

select (as of timestamp to_timestamp('2016-11-01 02:00:00','yyyy-mm-dd hh24:mi:ss'))
       t1.Field1, t2.Field2
  from table1 t1
  join table2 t2
    on t1.somekey = t2.somekey

これが可能かどうか、または現在の構文でそれが許可されていない場合は誰でも知っていますか?問題がある場合は11.2を使用していますが、オンラインで確認したところ、これが12で変更されたことが示唆されていません。

3
SqlRyan

DBMS_FLASHBACKパッケージと ENABLE_AT_TIMEプロシージャ (12.1ドキュメント)を確認してください。これにより、次のようなことが可能になります。

execute DBMS_FLASHBACK.Enable_At_Time(TIMESTAMP '2016-11-01 02:00:00');

次に、セッションは、指定されたタイムスタンプに最も近いSCNの時点ですべてのクエリを実行します。

SELECT t1.Field1, t2.Field2
FROM table1 t1
JOIN table2 t2 ON t1.somekey = t2.somekey

設定されたタイムスタンプの時点でフラッシュバッククエリの実行を停止するには、単にそれを無効にします。

execute DBMS_FLASHBACK.Disable;
5
Leigh Riffel

単一のクエリだけでなく、セッション全体でフラッシュバッククエリを使用して、指定された時間に対してクエリを実行できます。この時間はDBMS_FLASHBACK.ENABLE_AT_TIMEで設定できます。サンプルデータ:

create table t1 (id number);
create table t2 (id number);
insert into t1 values (1);
insert into t2 values (1);
commit;

現在の時刻とデータ:

SQL> select systimestamp from dual;

SYSTIMESTAMP
-----------------------------------
01-NOV-16 06.29.21.571559 PM +01:00

SQL> select id from t1 natural join t2;

        ID
----------
         1

次に、データを変更します。

update t1 set id = 2;
update t2 set id = 2;
commit;

SQL> select id from t1 natural join t2;

        ID
----------
         2

指定した時間でクエリを実行します。

SQL> exec dbms_flashback.enable_at_time(timestamp'2016-11-01 18:29:22');

PL/SQL procedure successfully completed.

SQL> select id from t1 natural join t2;

        ID
----------
         1
5
Balazs Papp