對應與轉換資料
瞭解用於整合來源表格與目標表格之間資料的作業、函數、命令及處理作業。
控制對應與資料整合的參數
Oracle GoldenGate 執行的所有資料選擇、對應和操控,都是使用 TABLE 和 MAP 參數的一或多個選項來完成。
-
在 Extract 參數檔中使用
TABLE。 -
在 Replicat 參數檔中使用
MAP。
TABLE 和 MAP 指定受參數檔中其他參數影響的資料庫物件。請參閱在 Oracle GoldenGate 輸入中指定物件名稱,瞭解在這些參數中指定物件名稱的指示。
Dissimilar 資料庫之間的對應
在具有不同資料結構的表格之間進行對應和轉換需要來源定義檔案、目標定義檔案,或是在某些情況下都需要。不相似資料庫之間的對應是由自行說明的歷程檔所控制,而且無論來源或目標資料欄的資料類型為何,都會以資料欄名稱來進行對應。
如果您不想要根據自我說明歷程檔自動對應,或想要回溯相容性,則可以使用 SOURCEDEFS 或 TARGETDEFS。
對應及轉換 NonStop 系統
如果您要將資料從 Windows 或 UNIX 系統對應或轉換成 NonStop Enscribe 目標,則必須在 Windows 或 UNIX 來源系統上執行對應或轉換。NonStop 的 Replicat 無法將三部分或兩部分的 SQL 表格名稱和資料類型轉換為用於 Enscribe 平台的三部分檔案名稱。Extract 可以使用 Enscribe 名稱和目標資料類型格式化歷程檔資料。
Windows 與 UNIX 系統上的對應與轉換
當 Oracle GoldenGate 只在以 Windows 為基礎且以 UNIX 為基礎的系統上運作時,可以在 Extract 處理作業或 Replicat 處理作業中執行資料欄對應與轉換。若要避免在 Extract 處理作業上增加此處理的額外負荷,您可以設定要在 Replicat 處理作業或中介系統上執行的對應和轉換。
如果有多個來源和一個目標,在來源上執行對應和轉換會比較有效率。
對應資料時的全域化考量
計劃在資料庫和平台之間對應和轉換資料時,請考慮 Oracle GoldenGate 在全球化方面的支援或不支援的項目。
在字元集之間轉換
如果來源和目標字元集不同,Oracle GoldenGate 會在來源和目標字元集之間進行轉換,以便將物件名稱和資料欄資料從一個資料庫正確地進行比較、對應和操控。如需支援的字元集清單,請參閱支援的字元集。
為了確保從一個資料庫到另一個資料庫的字元表現正確,下列必須是 true:
-
目標資料庫的字元集必須是來源資料庫字元集的超集或同等字元集。等效表示不相等,但具有相同的一組字元。例如,Shift-JIS 和 EUC-JP 技術不完全相等,但在大部分情況下都具有相同的字元。
-
如果您的從屬端應用程式使用不同的字元集,則資料庫字元集也必須是從屬端應用程式之字元集的超集或同等字元集。
-
在許多資料庫 (包括 Oracle) 中,都可以強制字元進入不屬於「字元集」的資料庫。Oracle GoldenGate 會將此值視為無效值,且在複製資料時可能無法正確對應此字元。對於這些類型的情況,您可以使用
REPLACEBADCHAR參數,如 Oracle GoldenGate 的參數和函數參照中所述。
在此組態中,從從屬端或來源字元集轉換成本機資料庫字元集時,會呈現每個字元。
Replicat 處理作業支援從一個來源字元集轉換成一個目標字元集。
資料庫物件名稱
Oracle GoldenGate 會以其母語處理目錄、綱要、表格和資料欄名稱,由來源和目標資料庫的字元集編碼決定。這項支援會保留單位元組和多位元組名稱、符號、重音字元,以及區分大小寫,並考量資料庫階層所有層級中可用的地區設定。
資料欄資料
當資料包含於下列資料欄類型時,Oracle GoldenGate 支援在字元集之間轉換資料欄資料:
-
字元類型資料欄:其他字元集的
CHAR/VARCHAR/CLOB至CHAR/VARCHAR/CLOB;以及CHAR/VARCHAR/CLOB至NCHAR/NVARCHAR/NCLOB. -
包含以字串為基礎的數字和日期 - 時間資料的資料欄。這些資料欄的轉換是在 z/OS EBCDIC 與非 z/OS ASCII 資料之間執行。此資料的 ASCII 與 ASCII 版本之間,或 EBCDIC 與 EBCDIC 版本之間未執行轉換,因為資料在這些情況下相容。
注意:Oracle GoldenGate 支援從
0001-01-03 00:00:00到9999-12-31 23:59:59的時戳資料。如果時間戳記是從 GMT 轉換成當地時間,這些限制也會套用至產生的時間戳記。不支援零月、零天欄位或全為零的日期值。例如,不支援 0000-00-00 00:00:00 等值,或任何包含零月或零日欄位的日期值。
資料欄資料的字元集轉換僅限於直接對應來源資料欄,以及 Replicat MAP 參數之 COLMAP 或 USEDEFAULTS 子句中的目標資料欄。直接對應是沒有使用預存程序或資料欄轉換函數的名稱與名稱對應。Replicat 會執行字元集轉換。Extract 未執行轉換。
地區設定保留
Oracle GoldenGate 會在比較不區分大小寫的物件名稱時,將資料庫的地區設定納入考量。如需支援的語言環境清單,請參閱支援的語言環境。
支援遁離序列
Oracle GoldenGate 支援使用遁離順序來代表參數檔中的字串資料欄、文字或物件名稱。如果作業系統不支援必要的字元 (例如控制字元),或為了其他需要不能在參數檔中使用字元的目的,您可以使用逸出序列。
逸出序列可用於參數檔中的任何位置,但在 TABLE 或 MAP 敘述句內的下列元素中特別有用:
-
物件名稱
-
WHERE子句 -
COLMAP子句可指派 Unicode 字元給 Unicode 資料欄,或指派原生編碼字元給資料欄。 -
COLMAP子句內的 Oracle GoldenGate 資料欄轉換函數。
Oracle GoldenGate 支援下列類型的遁離順序:
-
\uFFFFUnicode 逸出序列。除了替代配對之外,可以使用任何UNICODE程式碼點。 -
\377八進位逸出序列 -
\xFF十六進位逸出序列
套用規則如下:
-
如果用於對應
TABLE或MAP中的物件名稱,則不適用任何限制。例如,下列TABLE規格有效:TABLE schema."\u3000ABC"; -
如果與資料欄對應函數搭配使用,則可以使用任何程式碼點,但只能用於
NCHAR/NVARCHAR資料欄。對於CHAR/VARCHAR資料欄,代碼點限制為等同於 7 位元 ASCII。 -
來源和目標資料類型必須相同 (例如
NCHAR到NCHAR)。 -
以反向實體 (代碼點
U+005C) 開始每個逸出序列,後面接著字元代碼點。(實體更常被稱為反斜線符號)。在參數陳述式或資料欄轉換函數的輸入字串內,使用逸出順序 (而非實際字元)。注意:若要在參數檔中指定實際的反斜線,請指定雙反斜線。例如,以下將在
COL1: @STRFIND (COL1, '\' )中找到反斜線。
使用 \uFFFF Unicode Escape 順序
-
\uFFFFUnicode 遁離順序必須以小寫u為開頭,後面接著正好四個十六進位數字。 -
支援的範圍如下:
-
0至9(U+0030至U+0039) -
A至F(U+0041至U+0046) -
a至f(U+0061至U+0066)
-
\u20ac 是歐元幣別符號的 Unicode 逸出序列。
備註:若要獲得可靠的跨平台支援,請使用 Unicode 逸出序列。不同作業系統上未標準化八進位和十六進位逸出序列。
使用 \377 八進位遁離順序
-
必須只包含 3 個八進位數字。
-
支援的範圍 :
-
第一個數字的範圍是
0到3(U+0030到U+0033) -
第二和第三位數的範圍是
0到7(U+0030到U+0037)
\200是 Microsoft Windows 上歐元幣別符號的八進位逸出序列 -
使用 \xFF 十六進位遁離方程式
-
必須以小寫
x為開頭,後面接著兩個十六進位數字。 -
支援的範圍 :
-
0至9(U+0030至U+0039) -
A至F(U+0041至U+0046) -
a至f(U+0061至U+0066)
-
\x80 是 Microsoft Windows 1252 Latin1 程式碼頁面上歐元貨幣符號的十六進位逸出序列。
使用 TABLE 和 MAP 對應資料欄
Oracle GoldenGate 提供表格層次和全域層次的資料欄對應功能。如果沒有明確的資料欄對應規則,也提供預設資料欄對應。
本節包含下列對應資料欄準則:
資料欄名稱中的輔助大小寫和特殊字元
依照預設,Oracle GoldenGate 會遵循 SQL-92 規則來指定資料欄名稱和文字。在 Oracle GoldenGate 參數檔、轉換函數、使用者結束程式以及命令中,如果資料庫需要雙引號來強制區分大小寫,則資料欄名稱必須以雙引號括住。對於其他不需要引號的區分大小寫資料庫,必須在儲存於資料庫時指定區分大小寫的資料欄名稱。文字必須以單引號括住。如需詳細資訊,請參閱區分區分區分區分區分區分大小寫的資料欄名稱與文字。
使用 COLMAP 設定表格層次資料欄對應
如果您使用自我描述歷程檔,則來源物件上的任何資料欄都會對應至目標物件上的相同資料欄名稱。您只需要管理來源和目標之間不同的資料欄名稱,或需要轉換資料欄時。
不過,如果不使用自行描述歷程檔,則預設對應會依資料欄順序來完成,而非資料欄名稱。因此,來源上的資料欄 1 將對應至目標上的資料欄 1、資料欄 2 到資料欄 2 等等。
使用 MAP 和 TABLE 參數的 COLMAP 選項來:
-
將個別來源資料欄對應至名稱不同的目標資料欄。
-
指定不需要明確資料欄對應時的預設資料欄對應。
-
提供從來源資料欄選取、對應、轉譯資料,以及將資料移至目標資料欄的指示。
使用 USEDEFAULTS 啟用預設資料欄對應
您可以使用 COLMAP 的 USEDEFAULTS 選項,為名稱相同的任何對應來源和目標資料欄指定自動預設資料欄對應。USEDEFAULTS 可免除明確對應每個目標資料欄的需要,以節省您的時間。
預設對應會讓 Oracle GoldenGate 對應這些資料欄,並視需要根據資料定義檔案轉譯資料類型。請勿指定已與明確對映陳述式對應之欄的預設對映。
以下的資料欄對應範例說明使用來源表格 ACCTBL 和目標表格 ACCTTAB 的預設和明確資料欄對應。除了下列差異之外,兩個表格中的大部分資料欄都相同:
-
來源表格有
CUST_NAME資料欄,而目標表格有NAME資料欄。 -
來源表格中的 10 位數
PHONE_NO資料欄對應至目標表格中的個別AREA_CODE、PHONE_PREFIX和PHONE_NUMBER資料欄。 -
來源表格中的
YY, MM和DD資料欄分別對應至目標表格中的單一TRANSACTION_DATE資料欄。
為了解決這些差異,USEDEFAULTS 會用於自動對應相似的資料欄,而明確的對應和轉換函數則用於不同的資料欄。
下列範例顯示使用 MAP 和 TABLE 參數之 COLMAP 選項的資料欄對應。它描述來源表格 ACCTBL 與目標表格 ACCTTAB 的對應。
MAP SALES.ACCTBL, TARGET SALES.ACCTTAB,
COLMAP ( USEDEFAULTS,
NAME = CUST_NAME,
TRANSACTION_DATE = @DATE ('YYYY-MM-DD', 'YY',YEAR, 'MM', MONTH, 'DD', DAY),
AREA_CODE = @STREXT (PHONE_NO, 1, 3),
PHONE_PREFIX = @STREXT (PHONE_NO, 4, 6),
PHONE_NUMBER = @STREXT (PHONE_NO, 7, 10)
)
;
表格 3 範例資料欄對應
| 參數陳述式 | 說明 |
|---|---|
COLMAP |
開始 COLMAP 陳述式。 |
USEDEFAULTS, |
目標資料欄名稱相同時,將來源資料欄對應為原狀。 |
NAME = CUST_NAME, |
將來源資料欄 CUST_NAME 對應至目標資料欄 NAME。 |
TRANSACTION_DATE = @DATE ('YYYY-MM-DD', 'YY', YEAR, 'MM', MONTH, 'DD', DAY), |
使用 @DATE 資料欄轉換函數,將交易日期從來源日期資料欄轉換成目標資料欄 TRANSACTION_DATE。 |
AREA_CODE = @STREXT (PHONE_NO, 1, 3), PHONE_PREFIX = @STREXT (PHONE_NO, 4, 6), PHONE_NUMBER = @STREXT (PHONE_NO, 7, 10)) ; |
使用 @STREXT 資料欄轉換函數,將來源資料欄 PHONE_NO 轉換成 AREA_CODE、PHONE_PREFIX 和 PHONE_NUMBER 的個別目標資料欄。 |
如需有關規則的詳細資訊,請參閱瞭解預設資料欄對應,瞭解預設資料欄對應的 Oracle GoldenGate 後面。
指定要在 COLMAP 子句中對應的資料欄
COLMAP 語法如下:
COLMAP ([USEDEFAULTS, ] target_column = source_expression)
在此語法中,target_column 是目標欄的名稱,而 source_expression 則是。source_expressions 的一些範例包括:
-
來源資料欄的名稱,例如
ORD_DATE。 -
數值常數,例如
123。 -
字串常數以單引號括住,例如
'ABCD'。 -
使用 Oracle GoldenGate 資料欄轉換函數的表示式。在
COLMAP敘述句中,您可以使用任何 Oracle GoldenGate 資料欄轉換函數來轉換對應的資料欄資料,例如:@STREXT (COL1, 1, 3) -
以下是使用
BEFORE column_name的範例:BEFORE ORD_DATE -
以下是使用
AFTER column_name:AFTER ORD_DATE的範例。如果列出資料欄名稱,則此為預設選項。
如果資料欄對應涉及來自不同資料庫類型的區分大小寫資料欄,請指定儲存於資料庫中的每個資料欄。
-
如果資料庫需要雙引號來強制區分大小寫,請在雙引號內指定區分大小寫的資料欄名稱。
-
如果資料庫區分大小寫而不需要雙引號,請指定儲存於資料庫中的資料欄名稱。
下列顯示 Oracle AI Database 中的目標資料欄與 SQL Server 資料庫中區分大小寫的來源資料欄之間的對應。
COLMAP ("ColA" = ColA)
請參閱在 Oracle GoldenGate 輸入中指定物件名稱,瞭解有關指定 Oracle GoldenGate 名稱的詳細資訊。
在具有不同字元集和地區設定的資料庫中對應來源和目標資料欄時,請參閱對應資料時的全域化考量。
請避免使用 COLMAP 將值對應至索引鍵資料欄 (這會導致作業成為主索引鍵更新),Oracle GoldenGate 用來尋找目標資料列的 WHERE 子句在索引鍵資料欄影像之前不會使用正確的值。相反地,它將使用之後的影像。如果您根據該索引鍵資料欄使用任何函數,例如 SQLEXEC 敘述句,就會導致錯誤發生。
資料欄對應限制
以下是資料欄對應限制:
-
LOB資料欄無法用於FILTER、WHERE資料欄或COLMAP敘述句中的source_expression。LOB資料欄為BLOB、CLOB、NCLOB、XMLType、使用者定義的資料類型、巢狀表格、VARRAYs及其他特殊資料類型。 -
如果來源資料欄包含超過 4000 個位元組,就無法在轉換常式中使用,因為該值會儲存在歷程檔中作為
LOB記錄。例如,Oracle 中的VARCHAR2(4000 CHAR,日文字元集會儲存為每個字元的 3 個位元組。這表示資料欄的長度可能是 12000 個位元組,而 Oracle GoldenGate 會將此值儲存為LOB欄位。 -
Oracle GoldenGate 執行的完整 SQL 敘述句大小將超過 4MB。例如,如果您有一個包含數千個
VARCHAR2(4000)資料欄的表格,而且想要將 4000 個位元組放在每個表格中,這可能會導致 Oracle GoldenGate 將執行的 SQL 敘述句總數超過 4MB 的大小上限。
使用 COLMATCH 設定全域資料欄對應
使用 COLMATCH 參數來建立資料欄對應的全域規則。使用 COLMATCH,您可以在具有相同資料集之不同資料欄名稱的類似結構化表格之間進行對應。相較於使用表格層次對應搭配個別 TABLE 或 MAP 敘述句中的 COLMAP 子句,COLMATCH 提供更方便的方式來對應此類型的資料欄。
支援區分大小寫,如下所示:
-
For MySQL, SQL Server if the database is case-sensitive,
COLMATCHlooks for an exact case and name match regardless of whether or not a name is specified in quotes. -
如果 Oracle AI Database 和 Db2 資料庫的名稱在同一個資料庫中可以區分大小寫或不區分大小寫,而且需要雙引號來顯示區分大小寫,則當資料庫中的名稱在引號中時,
COLMATCH需要完全相符的大小寫和名稱。
語法
COLMATCH
{NAMES target_column = source_column |
PREFIX prefix |
SUFFIX suffix |
RESET}
| 引數 | 說明 |
|---|---|
NAMES target_column = source_column |
根據資料欄名稱對應。如果資料欄名稱有大小寫之分,請在資料欄名稱前後加上雙引號,而且資料庫需要引號來強制區分大小寫。對於這些資料庫類型,Oracle GoldenGate 會將未加引號的資料欄名稱視為不區分大小寫。對於支援區分大小寫且不需要引號的資料庫,請指定儲存於資料庫中的資料欄名稱。如果 COLMATCH 是在不同資料庫類型的資料欄之間,請確定名稱反映每個名稱的大小寫。例如,在 Oracle AI Database 中,下列指定區分大小寫的目標資料欄名稱 "aBc",在區分大小寫的 SQL Server 資料庫中指定來源資料欄名稱 aBc:COLMATCH NAMES "aBc" = aBc。 |
PREFIX prefix / SUFFIX suffix |
忽略指定的名稱字首或字尾。如果資料庫需要引號來強制區分大小寫 (例如 "P_"),請在前置碼或尾碼前後加上雙引號。對於那些資料庫類型,未加上引號的前置碼或尾碼會被視為不區分大小寫。對於支援區分大小寫且不需要引號的資料庫,請指定其儲存在資料庫中的字首或字尾。例如,"P_" 指定大寫 P 前置碼。下列範例指定要忽略的首碼 (不區分大小寫):COLMATCH PREFIX p_。目標欄名稱 P_ABC 對應至來源欄名稱 ABC,目標欄名稱 P_abc 對應至來源欄名稱 abc。下列範例指定要忽略的區分大小寫字尾:SUFFIX "_k"。目標資料欄名稱 ABC_k 會對應至來源資料欄名稱 ABC,而目標資料欄名稱 "abc_k" 會對應至來源資料欄名稱 abc。 |
RESET |
關閉先前為後續 TABLE 或 MAP 敘述句定義的 COLMATCH 規則。 |
下列範例說明使用 COLMATCH. 的時機來源和目標表格完全相同,但表格和資料欄 names.The 資料庫略有不同則不區分大小寫。
| ACCT 表格 | ORD 表格 |
|---|---|
CUST_CODE CUST_NAME CUST_ADDR PHONE S_REP S_REPCODE |
CUST_CODE CUST_NAME ORDER_ID ORDER_AMT S_REP S_REPCODE |
| ACCOUNT 表 | 訂單表格 |
|---|---|
CUSTOMER_CODE CUSTOMER_NAME CUSTOMER_ADDRESS PHONE REP REPCODE |
CUSTOMER_CODE CUSTOMER_NAME ORDER_ID ORDER_AMT REP REPCODE |
若要將來源資料欄對應至此範例中的目標資料欄,以及處理其他表格的後續對應,則語法為:
COLMATCH NAMES CUSTOMER_CODE = CUST_CODE
COLMATCH NAMES CUSTOMER_NAME = CUST_NAME
COLMATCH NAMES CUSTOMER_ADDRESS = CUST_ADDR
COLMATCH PREFIX S_
MAP SALES.ACCT, TARGET SALES.ACCOUNT, COLMAP (USEDEFAULTS);
MAP SALE.ORD, TARGET SALES.ORDER, COLMAP (USEDEFAULTS);
COLMATCH RESET
MAP SALES.REG, TARGET SALE.REG;
MAP SALES.PRICE, TARGET SALES.PRICE;
根據範例中的規則,會發生下列情況:
-
資料會從來源
ACCT和ORD表格中的CUST_CODE資料欄對應至目標ACCOUNT和ORDER表格中的CUSTOMER_CODE資料欄。 -
將會忽略
S_前置碼。 -
具有相同名稱的資料欄 (例如
PHONE和ORDER_AMT資料欄) 會自動以USEDEFAULTS的方式對應,而不需要明確的規則。如需詳細資訊,請參閱瞭解預設資料欄對應。 -
表格
REG和PRICE會關閉先前的全域資料欄對應。這些表格中的來源和目標資料欄會自動對應,因為所有名稱都相同。
瞭解預設欄對應
對於自行描述歷程檔,如果明確的資料欄對應不存在 (使用 COLMATCH 或 COLMAP),Oracle GoldenGate 會根據下列規則,預設對應來源和目標資料欄。
如果您使用 SOURCEDEFS 或 TARGETDEFS,則不適用此情況。
-
如果找到名稱和大小寫完全符合目標資料欄的來源資料欄,就會對應這兩個資料欄。
-
如果找不到相符的案例,則會使用後備名稱對應。備用對應會執行不區分大小寫的目標表格對應,以尋找相符的名稱。使用大寫名稱套用不精確的資料欄名稱比對。此行為由
GLOBALS參數NAMEMATCHIGNORECASE控制。您可以停用與NAMEMATCHEXACT參數相符的後備名稱,也可以使用NAMEMATCHNOWARNING參數讓後備名稱保持啟用狀態,但出現警告訊息。 -
未對應至任何來源資料欄的目標資料欄會採用由資料庫決定的預設值。
如果無法執行預設對應,則目標資料欄會預設為下表顯示的其中一個值。
| 資料欄類型 | 值 |
|---|---|
| 數值 | 零 (0) |
字元或 VARCHAR |
空格 |
| 日期或日期與時間 | 目前的日期和時間 |
可以使用 NULL 值的資料欄 |
空值 |
資料類型換算
瞭解 Oracle GoldenGate 如何對應資料類型。
數值欄
數值資料欄會轉換成符合目標資料欄的類型和比例。如果目標資料欄的比例小於來源的比例,則會在右側截斷數字。如果目標資料欄的比例大於來源的比例,則數字會在右邊填補零。
如需更多資訊,您可以使用 REPLACEBADNUM 參數,為對應數字資料欄時遇到的無效數值資料指定替代值。
字元類型資料欄
字元類型資料欄可以接受以字元為基礎的資料類型,例如 VARCHAR、字串形式的數字、字串形式的日期和時間,以及字串文字。如果目標資料欄的比例小於來源的比例,則右邊的資料欄會被截斷。如果目標資料欄的比例大於來源的比例,則資料欄會在右邊填補空格。
文字必須以單引號括住。
如需詳細資訊,請使用 REPLACEBADCHAR 參數來控制對應字元資料欄時,來源或目標字元集沒有有效的程式碼點時,Oracle GoldenGate 處理作業的回應。
日期時間資料欄
日期時間 (DATE、TIME 和 TIMESTAMP) 資料欄可以接受日期時間和字元資料欄,以及字串文字。文字必須以單引號括住。若要將字元資料欄對應至日期時間資料欄,請確定該資料欄符合 YYYY-MM-DD HH:MI:SS.FFFFFF. 的 Oracle GoldenGate 外部 SQL 格式
Oracle GoldenGate 支援從 0001-01-03 00:00:00 到 9999-12-31 23:59:59 的時戳資料。如果時間戳記是從 GMT 轉換成當地時間,這些限制也會套用至產生的時間戳記。視時區而定,轉換可能會增加或減去時數,這可能會導致時間戳記超過支援的下限或上限。
所需的精確度會根據資料類型和目標平台而有所不同。如果目標資料欄的比例小於來源的比例,則會在右側截斷資料。如果目標資料欄的比例大於來源的比例,則會在右邊以目前日期和時間的值延伸資料欄。
選取和篩選資料列
只能對 Oracle GoldenGate 可用的資料欄執行篩選。在 TRANLOG Extract Oracle GoldenGate 中,可以存取重做日誌和資料庫中的所有資料欄。如果資料欄不在重做日誌中,就必須明確擷取 (使用 FETCHCOLS) 資料欄才能進行篩選。在 Extract 泵浦和 Replicat 中,歷程檔中必須有資料欄可用。因此,您必須使用 ADD TRANDATA COLS 明確地記錄您要在 FILTER 或 WHERE 子句中使用的所有資料欄,而且必須保留預設值 LOGALLSUPCOLS。
若要篩除或選取用於擷取或複製的資料列,請使用 TABLE 和 MAP 參數的 FILTER 和 WHERE 子句。
FILTER 子句提供比 WHERE 子句更多的功能,因為您可以使用任何 Oracle GoldenGate 資料欄轉換函數,而 WHERE 子句接受基本的 WHERE 運算子。
使用 FILTER 子句選取資料列
使用 FILTER 子句,使用基本運算子或一或多個 Oracle GoldenGate 資料欄轉換函數,根據數值選取資料列。
注意:若要根據字串篩選資料欄,請使用其中一個 Oracle GoldenGate 字串函數或使用 WHERE 子句。
TABLE 敘述句中 FILTER 的語法如下:
TABLE source_table
, FILTER (
[, ON INSERT | ON UPDATE| ON DELETE]
[, IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE]
, filter_clause);
MAP 陳述式中的 FILTER 語法如下所示,其中包含錯誤處理選項。
MAP source_table, TARGET target_table,
, FILTER (
[, ON INSERT | ON UPDATE| ON DELETE]
[, IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE]
[, RAISEERROR error_number]
, filter_clause);
有效的 FILTER 子句元素如下:
-
Oracle GoldenGate 資料欄轉換函數。這些函數內建於 Oracle GoldenGate 中,因此您可以執行測試、操控資料、擷取值等等。如需有關 Oracle GoldenGate 轉換函數的詳細資訊,請參閱測試及轉換資料。
-
數字
-
包含數字的資料欄
-
傳回數字的函數
-
算術運算子:
-
+(加號) -
-(減號) -
*(乘) -
/(除外) -
%(餘數)
-
-
比較運算元:
-
>(大於) -
>=(大於或等於) -
<(小於) -
<=(小於或等於) -
=(等式) -
<>(不等於) -
從比較衍生的結果可以是零 (表示
FALSE) 或非零 (表示TRUE)。
-
-
括號 (用於在表示式中分組結果)
-
結合運算子:
AND、OR
使用下列 FILTER 選項來指定篩選子句所影響的 SQL 作業。這些選項都可以合併使用。
ON INSERT | ON UPDATE | ON DELETE IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE
使用 MAP 參數中 FILTER 的 RAISEERROR 選項,在篩選失敗時產生使用者定義的錯誤。當您需要觸發事件以回應失敗時,此選項非常有用。
使用 FILTER 子句內的 @RANGE 函數,將處理工作負載分散至多個 MAP 或 TABLE 敘述句。
以下是範例:
REPERROR (9999, EXCEPTION)
MAP OWNER.SRCTAB, TARGET OWNER.TARGTAB,
SQLEXEC (ID CHECK, ON UPDATE, QUERY ' SELECT COUNT FROM TARGTAB WHERE PKCOL = :P1 ', PARAMS (P1 = PKCOL)),
FILTER (BALANCE > 15000),
FILTER (ON UPDATE, @BEFORE (COUNT) = CHECK.COUNT)
;
MAP OWNER.SRCTAB, TARGET OWNER.TARGEXC,
EXCEPTIONSONLY,
COLMAP ( USEDEFAULTS,
ERRTYPE = 'UPDATE FILTER FAILED'
)
;
使用多個 FILTER 敘述句的表格 4
| 參數檔案 | 說明 |
|---|---|
REPERROR (9999, EXCEPTION) |
產生指定之錯誤的異常狀況。 |
MAP OWNER.SRCTAB, TARGET OWNER.TARGTAB, |
啟動 MAP 敘述句。 |
SQLEXEC (ID CHECK, ON UPDATE, QUERY ' SELECT COUNT FROM TARGTAB ' 'WHERE PKCOL = :P1 ', PARAMS (P1 = PKCOL)), |
每當遇到更新時,執行查詢以擷取 COUNT 資料欄的現值。BEFOREFILTER 選項也允許在處理 FILTER 子句之前先執行查詢或預存程序。這可讓 SQLEXEC 部分中的值在執行時期用於 FILTER 內。 |
FILTER (BALANCE > 15000), |
使用 FILTER 子句來選取餘額大於 15000 的資料列。 |
FILTER (ON UPDATE, @BEFORE (COUNT) = CHECK.COUNT) |
使用另一個 FILTER 子句,確保更新前的來源 COUNT 資料欄值與目標資料欄中的值相符,再套用目標更新。 |
; |
分號包含 MAP 敘述句。 |
MAP OWNER.SRCTAB, TARGET OWNER.TARGEXC, EXCEPTIONSONLY, COLMAP (USEDEFAULTS, ERRTYPE = 'UPDATE FILTER FAILED'); |
指定例外 MAP 陳述式。錯誤 9999 的 REPERROR 子句可確保將執行對應至 TARGEXC 的異常狀況。 |
範例 9-5 呼叫 @COMPUTE 函數
下列範例會呼叫 @COMPUTE 函數來擷取價格乘以金額超過 10,000 的記錄。
MAP SALES.TCUSTORD, TARGET SALES.TORD,
FILTER (@COMPUTE (PRODUCT_PRICE * PRODUCT_AMOUNT) > 10000);
範例 9-6 呼叫 @STREQ 函數
下列使用 @STREQ 函數來擷取字元資料欄值為 'JOE'. 的記錄
TABLE ACCT.TCUSTORD, FILTER (@STREQ ("Name", 'joe') > 0);
範例 9-7 選取記錄
下列項目會選取 AMOUNT 資料欄大於 50 的記錄,並對 UPDATE 和 DELETE 作業執行篩選。
TABLE ACT.TCUSTORD, FILTER (ON UPDATE, ON DELETE, AMOUNT > 50);
範例 9-8 使用 @RANGE 函數
(Replicat 群組 1 參數檔)
MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (1, 2, ID));
(Replicat 群組 2 參數檔)
MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (2, 2, ID));
您可以在一個 MAP 或 TABLE 敘述句中結合數個 FILTER 子句,如表格 9-4 中所示,其中顯示 Replicat 參數檔案的一部分。Oracle GoldenGate 會依列出的順序執行篩選,直到一個失敗或全部通過為止。如果某個篩選失敗,它們全部都會失敗。
使用 WHERE 子句選取列
使用 WHERE 子句中表格 9-5 中的任何元素,根據條件敘述句選取或排除資料列 (或兩者)。每個 WHERE 子句都必須括在括號內。文字必須以單引號括住。
表格 5 允許的 WHERE 運算子
| 元素 | 範例 |
|---|---|
| 資料欄名稱 | PRODUCT_AMT |
| 數值 | -123, 5500.123 |
| 公文字串 | 'AUTO', 'Ca' |
| 內建資料欄測試 | @NULL、@PRESENT、@ABSENT (資料欄為空值、存在或不在資料列中)。這些測試已內建於 Oracle GoldenGate 中。請參閱使用 FILTER 和 WHERE 選取列的注意事項。 |
| 比較運算元 | =, <>, >, <, >=, <= |
| 結合運算子 | AND, OR |
| 將括號分組 | 使用左括弧和右括弧 () 來進行多個元素的邏輯群組。 |
對於具有多位元組字元集或與本機作業系統字元集不相容之字元集的資料欄,Oracle GoldenGate 不支援 FILTER。
WHERE 不支援算術運算子和浮點資料類型。若要使用更複雜的選取條件,請使用 FILTER 子句或使用者結束常式。
WHERE 的語法與 TABLE 和 MAP 敘述句中的語法相同:
TABLE table, WHERE (clause);
MAP source_table, TARGET target_table, WHERE (clause);
使用 FILTER 與 WHERE 選取列的考量
下列建議可協助您建立成功的選取條款。注意:本節中的範例假設資料庫不區分大小寫。
確保篩選的資料可用性
如果資料庫只將已變更資料欄的值記錄到交易日誌中,如果選取條件參照任何未變更的資料欄,就會發生錯誤。Oracle GoldenGate 會忽略這類資料列作業、將它們輸出至捨棄檔,然後發出警告。
若要避免遺漏資料欄錯誤,請依下列方式建立您的選取條件:
-
如果可能,請只使用主索引鍵資料欄作為選取條件。
-
啟用這些資料欄的補充日誌記錄,讓必要的資料欄值可供使用。或者,您也可以使用
TABLE參數的FETCHCOLS或FETCHCOLSEXCEPT選項。這些選項適用於所有支援的資料庫。它們會查詢資料庫以擷取日誌中沒有的值。若要在執行FILTER或WHERE子句之前擷取值,請將FETCHBEFOREFILTER選項包含在FILTER或WHERE子句之前的TABLE敘述句中。舉例而言:
TABLE DEMO.PEOPLE, FETCHBEFOREFILTER, FETCHCOLS (age), FILTER (age > 50);
- 先測試資料欄的存在狀態,再測試資料欄的值。若要測試資料欄是否存在,請使用下列語法。
column_name {= | <>} {@PRESENT | @ABSENT}
下列範例會在 amount 資料欄超過 10,000 時傳回所有記錄,且在缺少 amount 時不會捨棄記錄。
WHERE (amount = @PRESENT AND amount > 10000)
比較資料欄值
若要確保比較中使用的元素相符,請比較適當的資料欄類型:
-
文字字串的字元資料欄。
-
數值欄為數值,可包含符號與小數點。
-
日期和時間資料欄是文字字串,使用應用程式擷取資料欄的格式。
測試空值
若要評估 NULL 值的資料欄,請使用下列語法。
column {= | <>} @NULL
如果資料欄值為 NULL,則會傳回 TRUE,因而複製資料列。它會針對所有其他情況傳回 FALSE (包括記錄中遺漏的資料欄)。
WHERE (amount = @NULL)
只有在記錄中有資料欄且不是 NULL 時,以下才會傳回 TRUE。
WHERE (amount = @PRESENT AND amount <> @NULL)
注意:如果歷程檔中的值包含超過 4000 個位元組,@NULL 函數就會傳回 TRUE。
擷取值之前與之後
對於更新和刪除作業,擷取來源資料欄的 BEFORE 值 (進行更新之前的值) 很有用。對於插入,會將所有資料欄值視為 AFTER 影像。
這些值會儲存在歷程檔中,並可用於篩選和資料欄對應。例如您可以:
-
在例外
MAP陳述式中擷取資料列的先前影像作為資料欄對應規格的一部分,並將這些值對應至例外表格,以用於測試或疑難排解衝突解決常式。 -
執行差異計算。例如,如果表格有
Balance資料欄,您可以從新餘額減去原始餘額來計算特定交易的淨結果,如下列範例所示:MAP "owner"."src", TARGET "owner"."targ", COLMAP (PK1 = PK1, delta = balance - @BEFORE (balance));注意:上一個範例指出區分大小寫的資料庫,例如 Oracle。表格名稱會以引號括住,以反映區分大小寫。
參考「之前」值
-
使用
@BEFORE資料欄轉換函數,搭配您要使用之前值的資料欄名稱,如下所示:@BEFORE (column_name) -
使用 Extract 參數檔中的
GETUPDATEBEFORES參數,在交易記錄的影像之前擷取,或在 Replicat 參數檔中使用該參數,在資料欄對應或篩選中使用前一個影像。如果使用「衝突解決與偵測 (CDR)」功能,您可以使用TABLE的GETBEFORECOLS選項。若要使用這些參數,交易日誌中必須要有所有資料欄。如果資料庫只記錄變更的資料欄值,使用@BEFORE函數可能會導致「遺漏資料欄」條件,而且會像資料欄不在記錄中一樣執行資料欄對應。請參閱確保篩選的資料可用性,以確保資料欄值可供使用。Oracle GoldenGate 也提供
@AFTER函數,可在需要篩選、用於轉換函數或其他用途時,擷取後續值。請參閱 Oracle GoldenGate 的參數與函數參照中的@BEFORE和@AFTER。
選取資料欄
若要控制由 Oracle GoldenGate 擷取的來源表格資料欄,請使用 TABLE 參數的 COLS 和 COLSEXCEPT 選項。使用 COLS 選取要擷取的資料欄,並使用 COLSEXCEPT 選取除 COLSEXCEPT 指定的資料欄以外的所有資料欄。
當目標表格未包含與來源表格相同的資料欄,或資料欄包含機密資訊 (例如個人 ID 號碼或其他專屬業務資訊) 時,限制擷取的資料欄會很有用。
選取和轉換 SQL 作業
依照預設,Oracle GoldenGate 會擷取並套用 INSERT、UPDATE 和 DELETE 作業。您可以在 Extract 或 Replicat 參數檔中使用下列參數來控制要處理的作業種類,例如僅插入或僅插入與更新。
GETINSERTS | IGNOREINSERTS
GETUPDATES | IGNOREUPDATES
GETDELETES | IGNOREDELETES
您可以使用 Replicat 參數檔中的下列參數,將一種類型的 SQL 作業轉換成另一種類型:
-
使用
INSERTUPDATES將來源更新作業轉換成插入至目標表格。這對於維護該表上的異動記錄相當有用。交易日誌記錄必須包含表格的所有資料欄值,而不只是變更的值。部分資料庫不會將完整資料列值記錄到其交易日誌,但是只會記錄那些變更的值。 -
使用
INSERTDELETES可將所有來源刪除作業轉換成插入目標表格。這對於保留來源資料庫中所有記錄的記錄記錄非常有用。 -
使用
UPDATEDELETES將來源刪除轉換為目標上的更新。
使用交易歷史記錄
Oracle GoldenGate 可讓您保留對目標記錄所做的變更歷史記錄,以及對應造成每個變更之作業的相關資訊。此記錄對於建立以異動為基礎的報告系統,其包含表格上所執行之每個作業的個別記錄,而非僅包含每個記錄的最新版本。
例如,對名為 CUSTOMER 的目標表格進行的下列一系列作業,不會追蹤 Dave 的 ID。最後一個作業會刪除記錄,因此無法找出 Dave 的帳戶歷史記錄或其期末餘額。
表格 6 客戶的作業歷史記錄
| 順序 | 作業 | ID | BALANCE |
|---|---|---|---|
1 |
Insert |
Dave |
1000 |
2 |
Update |
Dave |
900 |
3 |
Update |
Dave |
1250 |
4 |
Delete |
Dave |
1250 |
將此歷史記錄保留為一系列的記錄,在許多方面都很有用。例如,您可以產生交易的淨影響。
導入交易報表
-
若要準備擷取之前的值,請使用 Extract 參數檔中的
GETUPDATEBEFORES參數。先前值 (或之前影像) 是執行更新之前的資料欄現有值。影像啟用 Oracle GoldenGate 以建立異動記錄之前。 -
若要準備讓 Replicat 將所有作業發佈為插入,請使用 Replicat 參數檔中的
INSERTALLRECORDS參數。表格上的每個作業都會成為該表格中的新記錄。 -
若要對應交易歷史記錄,請使用
@GETENV資料欄轉換函數之GGHEADER選項的傳回值。在TABLE或MAP參數的COLMAP敘述句中包含轉換函數作為來源表示式。
使用表 9-6 中顯示的交易數列範例,可以建立下列參數組態來產生更多客戶交易導向檢視,而不是資料庫的最新狀態。
| 處理作業 | 參數陳述式 |
|---|---|
| 擷取 | GETUPDATEBEFORES TABLE ACCOUNT.CUSTOMER; |
| Replicat | INSERTALLRECORDS MAP SALES.CUSTOMER, TARGET SALES.CUSTHIST, COLMAP (TS = @GETENV ('GGHEADER', 'COMMITTIMESTAMP'), BEFORE_AFTER = @GETENV ('GGHEADER', 'BEFOREAFTERINDICATOR'), OP_TYPE = @GETENV ('GGHEADER', 'OPTYPE'), ID = ID, BALANCE = BALANCE); |
注意:這並不代表 Oracle GoldenGate 處理作業的完整參數檔。另請注意,這些範例代表不區分大小寫的資料庫。
此組態會進行可能的查詢,如下所示,它會傳回每筆交易的淨總和,以及交易的時間和客戶 ID。
SELECT AFTER.ID, AFTER.TS, AFTER.BALANCE - BEFORE.BALANCE
FROM CUSTHIST AFTER, CUSTHIST BEFORE
WHERE AFTER.ID = BEFORE.ID AND AFTER.TS = BEFORE.TS AND
AFTER.BEFORE_AFTER = 'A' AND BEFORE.BEFORE_AFTER = 'B';