EXCEPTIONSONLY
の使用
EXCEPTIONSONLY
は、ソース表とターゲット表の1つのペアがMAP
文で明示的に指定され、1対1でマップされている場合(つまり、ワイルドカードが使用されていない場合)に有効です。EXCEPTIONSONLY
を使用するには、ターゲットでEXCEPTIONSONLY
を使用するソース表ごとに、MAP
文を2つ作成します。
-
1番目の通常の
MAP
文によってソース表を実際のターゲット表にマップします。 -
2番目の例外MAP文によってソース表を(ターゲット表ではなく)例外表にマップします。例外
MAP
文は、ソース表でエラーが発生するとただちに実行され、行の値を例外表に送信します。MAP
文を例外MAP
文として指定するには、INSERTALLRECORDS
オプションとEXCEPTIONSONLY
オプションを使用します。例外MAP
文は、同じソース表が含まれる通常のMAP
文の直後に配置する必要があります。ソース表と例外表の列が同一でない場合、または例外表の追加の列に追加情報(列変換関数またはSQLEXEC
で取得した情報など)をマップする場合は、例外MAP
文でCOLMAP
句を使用します。
これらのパラメータの詳細は、Oracle GoldenGateパラメータおよび機能リファレンスを参照してください。
-
ソース表の
ggs.equip_account
をそのターゲット表のequip_account2
にマップする通常のMAP
文。 -
同じソース表を例外表の
ggs.equip_account_exception
にマップする例外MAP
文。
この場合、表自体に含まれる同じ列に加え、次の4つの追加列が作成されます。
DML_DATE OPTYPE DBERRNUM DBERRMSG
DML_DATE
列にデータを移入するため、@DATENOW
列変換関数を使用して失敗した操作の日時を取得し、結果を列にマップします。他の追加列にデータを移入するため、@GETENV
関数を使用して操作タイプ、データベース・エラー番号およびデータベース・エラー・メッセージを戻します。
例外MAP
文のEXCEPTIONSONLY
オプションによって、ソース表に対する操作が失敗した後にのみ文が実行されます。これによって、すべての操作が例外表に記録されることを防止します。
INSERTALLRECORDS
パラメータによって、指定したソース表に対するすべての失敗した操作は、その操作タイプにかかわらず挿入として例外表に記録されます。
ノート:
例外表に対して主キー制約または一意索引制約は指定できません。このシナリオでは一意性違反が発生する可能性があり、発生した場合はエラーが生成されます。
例11-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'));
この例では、REPERROR
パラメータはDEFAULT
エラー処理用に設定されています。EXCEPTION
オプションによって、Replicatプロセスは失敗した操作を例外として扱い、処理を継続します。