對應與轉換資料

瞭解用於整合來源表格與目標表格之間資料的作業、函數、命令及處理作業。

控制對應與資料整合的參數

Oracle GoldenGate 執行的所有資料選擇、對應和操控,都是使用 TABLE 和 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:

在此組態中,從從屬端或來源字元集轉換成本機資料庫字元集時,會呈現每個字元。

Replicat 處理作業支援從一個來源字元集轉換成一個目標字元集。

資料庫物件名稱

Oracle GoldenGate 會以其母語處理目錄、綱要、表格和資料欄名稱,由來源和目標資料庫的字元集編碼決定。這項支援會保留單位元組和多位元組名稱、符號、重音字元,以及區分大小寫,並考量資料庫階層所有層級中可用的地區設定。

資料欄資料

當資料包含於下列資料欄類型時,Oracle GoldenGate 支援在字元集之間轉換資料欄資料:

資料欄資料的字元集轉換僅限於直接對應來源資料欄,以及 Replicat MAP 參數之 COLMAP 或 USEDEFAULTS 子句中的目標資料欄。直接對應是沒有使用預存程序或資料欄轉換函數的名稱與名稱對應。Replicat 會執行字元集轉換。Extract 未執行轉換。

地區設定保留

Oracle GoldenGate 會在比較不區分大小寫的物件名稱時,將資料庫的地區設定納入考量。如需支援的語言環境清單,請參閱支援的語言環境。

支援遁離序列

Oracle GoldenGate 支援使用遁離順序來代表參數檔中的字串資料欄、文字或物件名稱。如果作業系統不支援必要的字元 (例如控制字元),或為了其他需要不能在參數檔中使用字元的目的,您可以使用逸出序列。

逸出序列可用於參數檔中的任何位置,但在 TABLE 或 MAP 敘述句內的下列元素中特別有用:

Oracle GoldenGate 支援下列類型的遁離順序:

套用規則如下:

使用 \uFFFF Unicode Escape 順序

\u20ac 是歐元幣別符號的 Unicode 逸出序列。

備註:若要獲得可靠的跨平台支援,請使用 Unicode 逸出序列。不同作業系統上未標準化八進位和十六進位逸出序列。

使用 \377 八進位遁離順序

使用 \xFF 十六進位遁離方程式

\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 的預設和明確資料欄對應。除了下列差異之外,兩個表格中的大部分資料欄都相同:

為了解決這些差異,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 的一些範例包括:

如果資料欄對應涉及來自不同資料庫類型的區分大小寫資料欄,請指定儲存於資料庫中的每個資料欄。

下列顯示 Oracle AI Database 中的目標資料欄與 SQL Server 資料庫中區分大小寫的來源資料欄之間的對應。

COLMAP ("ColA" = ColA)

請參閱在 Oracle GoldenGate 輸入中指定物件名稱,瞭解有關指定 Oracle GoldenGate 名稱的詳細資訊。

在具有不同字元集和地區設定的資料庫中對應來源和目標資料欄時,請參閱對應資料時的全域化考量。

請避免使用 COLMAP 將值對應至索引鍵資料欄 (這會導致作業成為主索引鍵更新),Oracle GoldenGate 用來尋找目標資料列的 WHERE 子句在索引鍵資料欄影像之前不會使用正確的值。相反地,它將使用之後的影像。如果您根據該索引鍵資料欄使用任何函數,例如 SQLEXEC 敘述句,就會導致錯誤發生。

資料欄對應限制

以下是資料欄對應限制:

使用 COLMATCH 設定全域資料欄對應

使用 COLMATCH 參數來建立資料欄對應的全域規則。使用 COLMATCH,您可以在具有相同資料集之不同資料欄名稱的類似結構化表格之間進行對應。相較於使用表格層次對應搭配個別 TABLE 或 MAP 敘述句中的 COLMAP 子句,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;

根據範例中的規則,會發生下列情況:

瞭解預設欄對應

對於自行描述歷程檔,如果明確的資料欄對應不存在 (使用 COLMATCH 或 COLMAP),Oracle GoldenGate 會根據下列規則,預設對應來源和目標資料欄。

如果您使用 SOURCEDEFS 或 TARGETDEFS,則不適用此情況。

如果無法執行預設對應,則目標資料欄會預設為下表顯示的其中一個值。

資料欄類型 值
數值 零 (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 子句元素如下:

使用下列 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 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 影像。

這些值會儲存在歷程檔中,並可用於篩選和資料欄對應。例如您可以:

參考「之前」值

  1. 使用 @BEFORE 資料欄轉換函數,搭配您要使用之前值的資料欄名稱,如下所示:

    @BEFORE (column_name)

  2. 使用 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 作業轉換成另一種類型:

使用交易歷史記錄

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

將此歷史記錄保留為一系列的記錄,在許多方面都很有用。例如,您可以產生交易的淨影響。

導入交易報表

  1. 若要準備擷取之前的值,請使用 Extract 參數檔中的 GETUPDATEBEFORES 參數。先前值 (或之前影像) 是執行更新之前的資料欄現有值。影像啟用 Oracle GoldenGate 以建立異動記錄之前。

  2. 若要準備讓 Replicat 將所有作業發佈為插入,請使用 Replicat 參數檔中的 INSERTALLRECORDS 參數。表格上的每個作業都會成為該表格中的新記錄。

  3. 若要對應交易歷史記錄,請使用 @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';