3.6 ERCALLBACKの使用

ERCALLBACKはOracle GoldenGateの基本的なユーザー・イグジット・ファンクションです。レコード・コンテキストをユーザー・イグジットに取得するために使用されます。これは、その中に複数の個別のファンクションを含むパッケージに似ています。これらのファンクションを呼び出すと、戻り値を取得できます。たとえば、GET_BEFORE_AFTER_INDまたはGET_COLUMN_VALUE_FROM_NAMEなどのファンクションを呼び出すことができます。これらのファンクションはfunction_codeと呼ばれます。

構文

ERCALLBACK (function_code, buffer, result_code );
function_code

コールバック・ルーチンによって実行されるファンクション。ユーザー・コールバック・ルーチンは、コールバック・ルーチンに渡されるファンクション・コードに基づいて異なる動作をします。一部のファンクションは、ExtractおよびReplicat両方が使用できますが、各プロセスでのファンクションの有効性は、コールバック・ルーチン中にそのファンクションに対して設定される入力パラメータに依存します。使用可能なファンクション・コードの詳細は、ファンクション・コードを参照してください。

buffer

指定するファンクション・コードに関連付けられている事前定義済構造体を含むバッファへのvoidポインタ。

result_code

コールバック・ルーチンによって実行されるファンクションのステータス。コールバック・ルーチンによって返される結果コードは、コールバック・ファンクションが成功したかどうかを示します。結果コードは、表3-4の値の1つになります。

表3-4 結果コード

コード 説明

EXIT_FN_RET_BAD_COLUMN_DATA

列データを取得または設定中に無効なデータを検出しました。

EXIT_FN_RET_BAD_DATE_TIME

ofの日付、タイムスタンプまたは間隔タイプに、無効な日付または時刻の値が含まれています。

EXIT_FN_RET_BAD_NUMERIC_VALUE

列の数値タイプに、無効な数値が含まれています。

EXIT_FN_RET_COLUMN_NOT_FOUND

圧縮更新レコードで列が見つかりませんでした(変更された値のみを記録するデータベースによる更新)。

EXIT_FN_RET_ENV_NOT_FOUND

指定された環境値がレコードに見つかりませんでした。

EXIT_FN_RET_EXCEEDED_MAX_LENGTH

表または列名が割り当てられたバッファに収まらなかったため、メタデータを取得できませんでした。

EXIT_FN_RET_FETCH_ERROR

レコードをフェッチできませんでした。エラー・メッセージを表示して理由を確認してください。

EXIT_FN_RET_INCOMPLETE_DDL_REC

DDLレコードの処理中に内部エラーが発生しました。レコードが不完全の可能性があります。

EXIT_FN_RET_INVALID_CALLBACK_FNC_CD

無効なコールバック・ファンクション・コードがコールバック・ルーチンに渡されました。

EXIT_FN_RET_INVALID_COLUMN

ファンクション・コールで、存在しない列が参照されました。

EXIT_FN_RET_INVALID_COLUMN_TYPE

ルーチンは、その目的ではOracle GoldenGateにサポートされていないデータ型を操作しようとしています。

EXIT_FN_RET_INVALID_CONTEXT

コールバック・ファンクションが不適切なときにコールされました。

EXIT_FN_RET_INVALID_PARAM

無効なパラメータがコールバック・ファンクションに渡されました。

EXIT_FN_RET_NO_SRCDB_INSTANCE

ソース・データベース・インスタンスが見つかりませんでした。

EXIT_FN_RET_NO_TGTDB_INSTANCE

ターゲット・データベース・インスタンスが見つかりませんでした。

EXIT_FN_RET_NOT_SUPPORTED

このファンクションは、このプロセスに対してサポートされていません。

EXIT_FN_RET_OK

コールバック・ファンクションは成功しました。

EXIT_FN_RET_SESSION_CS_CNV_ERR

文字セット変換ルーチンにULIB_ERR_INVALID_CHAR_FOUNDエラーが返されました。変換は失敗しました。

EXIT_FN_RET_TABLE_NOT_FOUND

無効な表名が指定されました。

EXIT_FN_RET_TOKEN_NOT_FOUND

指定されたトークンがレコードに見つかりませんでした。

ERCALLBACKを使用して多数のファンクション・コールを実行できます。たとえば、表の名前を取得する場合は、次のコマンドを使用できます。

ERCALLBACK (GET_TABLE_NAME, &var, &result_code)

これらのファンクションをユーザー・イグジットのcコード内で使用して、セクションFunction Codesで指定されるファンクションのコールを実行します。異なるfunction_codeコールの組合せにより、ERCALLBACKを使用して次のように様々なタスクを実行できます。
  • DML文の再作成
  • 変換の実行
  • レコードからの特定の列の取得
  • レポート・ファイルへの情報の書込み

たとえば、ハートビート表のラグが特定のしきい値を超えるたびにメッセージをレポート・ファイルに書き込む必要がある場合は、CUSEREXITファンクションを使用できます。CUSEREXITファンクションでERCALLBACKに多数のコールを行うと、ラグの列データを取得し、計算および比較を実行します。ラグが指定したしきい値を超えた場合、レポート・ファイルにメッセージが書き込まれます。