【Flashback】使用檢視快速獲得Flashback Query閃回查詢資料

secooler發表於2011-08-09
  關於閃回查詢的基本使用方法請參見文章《【Flashback】Flashback Query功能實踐》(http://space.itpub.net/519536/viewspace-587004)。
  本文給出使用檢視協助我們快速構造閃回查詢內容,透過檢視可以方便的檢索“歷史上的資料”。

1.構造閃回查詢檢視需求描述
1)準備員工表和工資表
2)刪除工資表中僱傭年限在1994年之前的記錄
3)建立檢視可以查詢工資表刪除之前的記錄

2.準備環境
1)準備員工表和工資表
sec@ora10g> create table emp (id number,name varchar2(20), e_date date);

Table created.

sec@ora10g> create table salary (id number, salary number);

Table created.

emp表包含員工ID、員工名字和僱傭時間資訊;
salary表中包含員工ID和薪水資訊。

2)初始化資料
insert into emp values (1,'Secooler',to_date('1991-01-01','yyyy-mm-dd'));
insert into emp values (2,'Andy',to_date('1992-01-01','yyyy-mm-dd'));
insert into emp values (3,'HOU',to_date('2010-01-01','yyyy-mm-dd'));
insert into emp values (4,'Shengwen',to_date('2011-01-01','yyyy-mm-dd'));
commit;

insert into salary values (1,60000);
insert into salary values (2,50000);
insert into salary values (3,40000);
insert into salary values (4,30000);
commit;

3)獲取初始化資料內容
sec@ora10g> select * from emp;

        ID NAME                           E_DATE
---------- ------------------------------ -----------------
         1 Secooler                       19910101 00:00:00
         2 Andy                           19920101 00:00:00
         3 HOU                            20100101 00:00:00
         4 Shengwen                       20110101 00:00:00

sec@ora10g> select * from salary;

        ID     SALARY
---------- ----------
         1      60000
         2      50000
         3      40000
         4      30000

3.為構造後續的閃回查詢查詢當前的時間和SCN號
1)查詢當前時間
sec@ora10g> select sysdate from dual;

SYSDATE
-----------------
20110809 21:34:11

2)查詢當前系統SCN號
sec@ora10g> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 3141326

4.刪除工資表中僱傭年限在1994年之前的記錄
sec@ora10g> delete from salary where id in ( select id from emp where e_date < to_date('1994','yyyy'));

2 rows deleted.

sec@ora10g> commit;

Commit complete.

sec@ora10g> select * from emp;

        ID NAME                           E_DATE
---------- ------------------------------ -----------------
         1 Secooler                       19910101 00:00:00
         2 Andy                           19920101 00:00:00
         3 HOU                            20100101 00:00:00
         4 Shengwen                       20110101 00:00:00

sec@ora10g> select * from salary;

        ID     SALARY
---------- ----------
         3      40000
         4      30000

此時,在salary表中1994年之前的員工資訊已經被刪除,並且資料修改已經提交。

5.兩種方法建立檢視構造閃回查詢刪除之前的資料
1)第一種方法:使用時間戳來構造閃回查詢檢視
sec@ora10g> create view v_salary_timestamp as select * from salary as of timestamp to_timestamp('2011-08-09 21:34:11','YYYY-MM-DD HH24:MI:SS');

View created.

2)第二種方法:使用SCN構造閃回查詢檢視
sec@ora10g> create view v_salary_scn as select * from salary as of scn 3141326;

View created.

6.使用檢視獲取閃回查詢資料
sec@ora10g> select * from v_salary_timestamp;

        ID     SALARY
---------- ----------
         1      60000
         2      50000
         3      40000
         4      30000

sec@ora10g> select * from v_salary_scn;

        ID     SALARY
---------- ----------
         1      60000
         2      50000
         3      40000
         4      30000

到此,兩種構造檢視的方法都順利的獲得了閃回查詢的資料。順利的完成任務。

7.小結
  Oracle的閃回查詢功能本身的能耐自不必多說。使用檢視將閃回查詢語句進行一次“封裝”後,我們便得到了另外一種直觀的便利。

Good luck.

secooler
11.08.09

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-704539/,如需轉載,請註明出處,否則將追究法律責任。

相關文章