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パラメータによって、指定したソース表に対するすべての失敗した操作は、その操作タイプにかかわらず挿入として例外表に記録されます。
ノート:
例外表に対して主キー制約または一意索引制約は指定できません。このシナリオでは一意性違反が発生する可能性があり、発生した場合はエラーが生成されます。
例8-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プロセスは失敗した操作を例外として扱い、処理を継続します。