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>

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

表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_codeコールを組み合せると、ERCALLBACKを使用して次のような多くのタスクを実行できます。

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