當前位置:才華齋>IT認證>Oracle認證>

怎麼用Oracle10g新的行時間戳捕捉變化

Oracle認證 閱讀(1.94W)

資料倉庫經常通過多種資料來源系統填充,而每種系統都執行有自己的應用程式。所以為了能給資料倉庫只提供新資料,確定哪些是最近更新的行是一件非常複雜的事。在處理一些其架構中不包括“上次更新時間”列的過時軟體時,這尤其是一個難題。企業自然不情願僅僅為了追蹤變化而通過修改工作程式碼來新增列。

怎麼用Oracle10g新的行時間戳捕捉變化

在Oracle 10g中,在行最後一次被更新的時候,每一行都有一個新的被稱作ORA_ROWSCN的偽列。 ORA_ROWSCN 提供了一個“保守上邊界(conservative upper bound)”系統改變數,用來記錄最近被修改的行的事務。這就意味著系統改變數(SCN)是一個估計值,因為在Oracle中系統改變數只能預設在模組級被追蹤。

例如在列表A中,ORA_ROWSCN 在處理一個小表格時被選中,一行被更新後,ORA_ROWSCN 再次被選中。

列表ASQL> SQL> SELECT ora_rowscn, ename, sal  2  FROM emp;ORA_ROWSCN ENAME             SAL                                               ---------- ---------- ----------                                                   529426 SMITH             800                                                   529426 ALLEN            1600                                                   529426 WARD             1250                                                   529426 JONES            2975                                                   529426 MARTIN           1250                                                   529426 BLAKE            2850                                                   529426 CLARK            2450                                                   529426 SCOTT            3000                                                   529426 KING             5000                                                   529426 TURNER           1500                                                   529426 ADAMS            1100                                               ORA_ROWSCN ENAME            SAL                                               ---------- ---------- ----------                                                   529426 JAMES             950                                                   529426 FORD             3000                                                   529426 MILLER           1300                                               14 rows > UPDATE emp  2  SETsal = 6000  3  WHERE ename = 'KING';1 row > commit;Commit > SELECT ora_rowscn, ename, sal  2  FROM emp;ORA_ROWSCN ENAME             SAL                                               ---------- ---------- ----------                                                   653331 SMITH             800                                                   653331 ALLEN            1600                                                   653331 WARD             1250                                                   653331 JONES            2975                                                   653331 MARTIN           1250                                                   653331 BLAKE            2850                                                   653331 CLARK            2450                                                   653331 SCOTT            3000                                                   653331 KING             6000                                                   653331 TURNER           1500                                                   653331 ADAMS            1100                                               ORA_ROWSCN ENAME             SAL                                               ---------- ---------- ----------                                                   653331 JAMES             950                                                   653331 FORD             3000                                                   653331 MILLER           1300                                               14 rows > SELECT SCN_TO_TIMESTAMP(653331) FROM dual;SCN_TO_TIMESTAMP(653331)                                                       ---------------------------------------------------------------------------    20-JUN-06 000000 PM

即使只有一行被改動了,剩下的也會顯示一個新的.系統改變數(SCN)。(更準確地說,你可以在一個表第一次被建立時,使用行級系統改變數追蹤。但遺憾的是,你不能夠更改該表格,以便在以後加入該特性。)所以如果被更新的塊數比表中的塊數要少,這也可以成為一種發現變化的方法,而不用涉及太多額外的行。

如果你需要與事務有關的日期和時間應該怎麼辦呢?SCN_TO_TIMESTAMP函式可以將ORA_ROWSCN 轉換成為一個時間戳,利用它你可以進行查詢,或者把它用作一個WHERE 子句的謂語。但是,這個時間戳仍然是一個估計值。

ORA_ROWSCN 也是將系統改變值(SCN)用作閃回查詢捷徑(儘管RA_ROWSCN 本身在閃回中並不能被選中)的一種很方便的方法,不然就要用閃回形式查詢,選中VERSIONS_STARTSCN 和VERSIONS_ENDSCN 偽列。

列表B是一次閃回查詢,它用一個小於當前值的系統改變值來獲得一個數據行原來的值。我們發現King的工資回到了5000,而ORA_ROWSCN的值則是最初的系統改變值。

列表BSQL> SELECT ora_rowscn, ename, sal  2  FROMemp AS OF SCN (653330)  3  WHERE ename = 'KING';ORA_ROWSCN ENAME             SAL                                               ---------- ---------- ----------                                                   529426 KING             5000