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

この例では、REPERROREXCEPTIONSONLYおよび例外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プロセスは失敗した操作を例外として扱い、処理を継続します。