僅使用 EXCEPTIONSONLY
EXCEPTIONSONLY 對一組在 MAP 敘述句中明確命名並對應一對一的來源和目標表格有效;亦即,不能使用萬用字元。若要使用 EXCEPTIONSONLY,請為要在目標上使用 EXCEPTIONSONLY 的每個來源表格建立兩個 MAP 敘述句:
-
第一個標準
MAP敘述句會將來源表格對應至實際的目標表格。 -
第二個是例外 MAP 陳述式,將來源表格對應至例外表格 (而非目標表格)。異常狀況
MAP敘述句會在來源表格發生錯誤後立即執行,以將資料列值傳送至異常狀況表格。若要將
MAP陳述式識別為例外MAP陳述式,請使用INSERTALLRECORDS與EXCEPTIONSONLY選項。MAP敘述句的異常狀況必須緊接在包含相同來源表格的一般MAP敘述句之後。如果來源和異常狀況表格資料欄不相同,或者想要將其他資訊對應至異常狀況表格中的額外資料欄 (例如透過資料欄轉換函數擷取的資訊或SQLEXEC擷取的資訊),請在異常狀況MAP敘述句中使用COLMAP子句。
如需有關這些參數的詳細資訊,請參閱 Oracle GoldenGate 的參數與函數參照。
-
將來源表格
ggs.equip_account對應至其目標表格equip_account 2.的一般MAP敘述句 -
將相同來源表格對應至例外表格
ggs.equip_account_exception的例外MAP陳述式。
在此案例中,除了表格本身包含的相同資料欄之外,還會建立四個額外的資料欄:
DML_DATE
OPTYPE
DBERRNUM
DBERRMSG
若要填入 DML_DATE 資料欄,會使用 @DATENOW 資料欄轉換函數來取得失敗作業的日期和時間,結果會對應至資料欄。若要填入其他額外的資料欄,@GETENV 函數可用來傳回作業類型、資料庫錯誤編號以及資料庫錯誤訊息。
異常狀況 MAP 敘述句的 EXCEPTIONSONLY 選項,只會在來源表格的作業失敗後執行敘述句。它會防止將每個作業記錄到異常狀況表格中。
INSERTALLRECORDS 參數會將指定來源表格的所有失敗作業 (不論作業類型為何) 記錄為 inserts 的例外表格。備註:例外資料表上沒有主索引鍵或唯一的索引限制。此案例中可能會發生唯一性違規,並會產生錯誤。
範例 9-21 EXCEPTIONSONLY
此範例顯示如何將 REPERROR 與 EXCEPTIONSONLY 搭配使用,以及例外 MAP 陳述式。此範例只顯示與 REPERROR 相關的參數;Replicat 也需要其他與錯誤處理無關的參數。
REPERROR (DEFAULT, EXCEPTION)
MAP ggs.equip_account, TARGET ggs.equip_account2,
COLMAP (USEDEFAULTS);
MAP ggs.equip_account, TARGET ggs.equip_account_exception,
EXCEPTIONSONLY,
INSERTALLRECORDS
COLMAP (USEDEFAULTS,
DML_DATE = @DATENOW (),
OPTYPE = @GETENV ('LASTERR', 'OPTYPE'),
DBERRNUM = @GETENV ('LASTERR', 'DBERRNUM'),
DBERRMSG = @GETENV ('LASTERR', 'DBERRMSG'));
在此範例中,為 DEFAULT 錯誤處理設定了 REPERROR 參數,而 EXCEPTION 選項會讓 Replicat 處理作業將失敗的作業視為異常狀況並繼續處理。