本文主要介紹OGG中一些過濾或計算函數的用法,以及sqlexec的基本用法
SQLPREDICATE
在使用OGG初始化時,可以添加此參數到extract中,用於選擇符合條件的記錄,下面是OGG官方文檔中的描述 :
“在用OGG初始化數據時,使用SQLPredicate是比where或filter更好的一個選項。使用此語句比其它參數初始化更快,因為它直接作用於SQL語句,告訴OGG不應該取所有數據之后再過濾(這正是其它參數的運行方式),而是應該只取需要的部分。”
如下
TABLE ggs_owner.emp_details, SQLPREDICATE “where ename=’Gavin’”;
針對目標端的數據過濾,仍然可以在replicat上使用where條件進行數據過濾,即只取extract出來的部分數據進行投遞,如下:
MAP ggs_owner.emp_details, TARGET ggs_owner.emp_details, WHERE (ename=”Gavin”);
FILTER
Filter的功能遠比where強大,你可以在任何有字段轉換的地方使用它進行數據過濾,而where只能使用基本的操作符。比如,我們可以在OGG的這些函數(@COMPUTE, @DATE, @STRFIND, @STRNUM等)中使用數值運算符:
‘+’,’-’,’/’,’*’或比較操作符‘>’,’<', '='。
下面的配置示例中我們在extract中使用STRFIND函數,捕獲ename字段中只符合相應條件的記錄,配置如下:
TABLE ggs_owner.emp_details,FILTER (@STRFIND (ename, “Gavin”) > 0);
COMPUTE
接下來的示例講解如何使用@COMPUTE函數,本示例中基於某原始字段值,計算同一張表中其它字段的值。
在本示例中的目標表EMP與源表結構不同,目標表上有多出來的一個字段COMM。COMM字段的值由源字段SAL*1.1計算得到。由於兩邊表結構不同,因此,我們需要先用defgen程序創建一個定義文件。
首先,我們在目標端上基於EMP表創建defgen參數文件:
edit params defgen
DEFSFILE /home/oracle/goldengate/dirsql/emp.sql |
然后在OGG安裝目錄下執行:
[oracle@linux02 goldengate]$ ./defgen paramfile ./dirprm/defgen.prm
目標端的replicat參數文件定義如下,里面用到了colmap和compute。colmap中的useDefaults告訴OGG,源和目標表的字段按名稱自動匹配,而目標表的comm字段,則由源端的sal字段運算得到。
REPLICAT rep1 |
基於上面的配置進行數據同步測試,可以看到目標表中comm的字段值是sal字段值的1.1倍,如下:
SQL> select * from emp;
EMPNO ENAME DEPTNO SAL COMM
---------- -------------------- ---------- ---------- ----------
1001 Gavin 10 1000 1100
1002 Mark 20 2000 2200
1003 John 30 3000 3300
SQLEXEC
SQLEXEC可以在extract或replicat中用於執行SQL語句、存儲過程或SQL函數。比如,針對大批量的數據加載,我們可以先將表的索引刪除,待數據加載完成之后,再重建索引,從而提高數據同步的性能。在下面replicat示例中,可以看到類似的配置示例:
REPLICAT rep1 |