フラッシュバッククエリーに関する検証 その3

~フラッシュバッククエリーに関する検証 その3 ~
ペンネーム ちゃむ

前回は、フラッシュバッククエリーを使用するための初期化パラメータの設定
方法と初期化パラメータの設定自体の設定の注意点を説明した。本来であれば、
undo表領域の作成方法などもおさえる必要があるが、今回は、フラッシュバッ
ククエリーを実際に使ってみるところに重点を置く。

まずは、初期化パラメータを以下のようにして使用できる環境を整える。
undo_management=AUTOになっており、undo_tablespaceに適切なUNDO表領域が
指定されていれば使用できる。

SQL> SELECT NAME,VALUE FROM V$PARAMETER WHERE NAME LIKE 'UNDO%'

NAME                 VALUE                
-------------------- -------------------- 
undo_management      AUTO                 
undo_tablespace      UNDOTBS              
undo_suppress_errors FALSE                
undo_retention       900                  

「その1」で説明したdbms_flashbackパッケージの実行権限を与えることも
重要である。

SQL> GRANT EXECUTE ON dbms_flashback TO scott;

<SCOTTでフラッシュバッククエリーを実行してみる>

1.既にテーブルaという14行のデータが存在することを確認。

SQL> select count(*) from a;

  COUNT(*)
----------
        14

2.テーブルaのデータを削除してコミットする。(2001/12/26 13:54:44頃)

SQL> delete from a;
14 rows deleted.

SQL> commit;
Commit complete.

SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2001/12/26 13:54:44

3.次に戻りたい時間を指定する。(2.の一時間前を指定 2001/12/26 12:54:44)
その後で、select文を実行

SQL> alter session set NLS_TIMESTAMP_FORMAT = 'yyyy/mm/dd hh24:mi:ss';
Session altered.

SQL>  execute dbms_flashback.enable_at_time('2001/12/26 12:54:44');
PL/SQL procedure successfully completed.

SQL> select count(*) from a;

  COUNT(*)
----------
        14

確かに検索できる。でも、このデータを別テーブルに保存したくなるのが人情
というものだろう。

4.別テーブルに保存したい!!

<create as select>

SQL> create table b as select  * from a;

ORA-08182: operation not supported while in Flashback mode

<同じレイアウトのテーブルを作成してinsertでは>

SQL> insert into b select * from a;

ORA-08182: operation not supported while in Flashback mode

そうなのだ。残念ながら、DDL文やselect以外のDML文(更新処理)は、フラッシュ
バッククエリー中のセッションでは、実行できないのだ。これが、できれば、リカ
バリなどの面でも役立つのに!!
実は、PL/SQLを用いれば実現できる。これに関しては、次回説明しよう。

5.今回は簡単にテキストファイルに出力!!

以下のようにspoolしておけば、sqlldrなどでローディングできるだろう。
‘,’を文字列連結しておけば、何かとローディングしやすいcsvファイルが作成で
きる。但し、カラムの値の中にカンマがあるときは、データなどを事前に整備して
おく必要があるだろう。

SQL> set pages 0
SQL> set feed off
SQL> spool a.txt
SQL> select empno || ',' || ename || ',' || job ||  ',' || mgr from a;

7369,monkey,CLERK,7902
7499,monkey,SALESMAN,7698
7521,monkey,SALESMAN,7698
7566,monkey,MANAGER,7839
7654,monkey,SALESMAN,7698
7698,monkey,MANAGER,7839
7782,monkey,MANAGER,7839
7788,monkey,ANALYST,7566
7839,monkey,PRESIDENT,
7844,monkey,SALESMAN,7698
7876,monkey,CLERK,7788
7900,monkey,CLERK,7698
7902,monkey,ANALYST,7566
7934,monkey,CLERK,7782
SQL> spool off

次回は、このフラッシュバッククエリーで検索したデータをテーブルなどに格
納する方法に迫る。

以上 さあ出かけよう。ぼくらは若者なにも恐くない 茅ケ崎にて