GoldenGate使用SQLEXEC和GETVAL實現碼錶關聯

margiex發表於2018-04-22

使用OGG中的SQLEXEC引數,可以執行SQL語句或儲存過程,再加上@GETVAL函式,可以在目標端獲取源表沒有的欄位值。比如,源端有一個事實表和一個程式碼表COUNTRY_CODES,程式碼表中有兩個欄位:country_name 和 country_id,事實表即customers表,裡面只有country_id欄位。

我們希望在目標端的customers中,增加一列country_name欄位,並在OGG同步的過程中,針對這個欄位賦值,這樣在目標端可以直接select customers檢視資料,不用再關聯COUNTRY_CODES表。

下面分別演示使用SQL語句和儲存過程的實現方式。

方法一,使用SQL語句

以下使用SQL語句獲取COUNTRY_NAME ,抽取程式引數:

EXTRACT gavinext

USERID idit_prd, PASSWORD idit_prd

RMTHOST indb02, MGRPORT 7809

RMTTRAIL ./dirdat/xx

TABLE idit_prd.customers;


以下是目標端引數:

REPLICAT gavinrep

SETENV (NLS_LANG=”AMERICAN_AMERICA.WE8ISO8859P1″)

SETENV (ORACLE_SID=GGDB2)

ASSUMETARGETDEFS

USERID idit_prd,PASSWORD idit_prd

MAP idit_prd.customers, TARGET idit_prd.customers, &

SQLEXEC (ID lookup, &

QUERY “select country_name cname from country_code where country_id =:v_country_id”,&

PARAMS (v_country_id = country_id)),&

COLMAP (USEDEFAULTS, country_name = @GETVAL (lookup.cname) );


方法二,使用儲存過程

定義一個SP基於country_id獲取country_name, 如下:

create or replace procedure get_country

(v_country_id IN number, v_country_name OUT varchar2 )

is

begin

select country_name into v_country_name from country_code where country_id= v_country_id;

end;

/


以下演示如何在replicat中呼叫SP獲取額外的欄位值。

REPLICAT gavinrep

SETENV (NLS_LANG=”AMERICAN_AMERICA.WE8ISO8859P1″)

SETENV (ORACLE_SID=GGDB2)

ASSUMETARGETDEFS

USERID idit_prd,PASSWORD idit_prd

MAP idit_prd.customers, TARGET idit_prd.customers, &

SQLEXEC (SPNAME GET_COUNTRY, &

PARAMS (v_country_id = country_id)),&

COLMAP (USEDEFAULTS, country_name = @getval (GET_COUNTRY.V_COUNTRY_NAME) );

除了上面的應用,還可以獲取多個欄位計算後的值到目標欄位,從而實現簡單的ETL轉換。

相關文章