主コンテンツへ
Oracle® Fusion Middleware Oracle GoldenGateリファレンスfor Windows and UNIX
12c (12.2.0.1)
E70112-04
目次へ移動
目次

前
次

6.19 GET_COLUMN_VALUE_FROM_INDEX

適用対象

ExtractおよびReplicat

説明

GET_COLUMN_VALUE_FROM_INDEXファンクションでは、指定する列索引を使用して、データ・レコードから列値を取得します。列値は、ユーザー・イグジット内のほとんどのロジックの基本です。データ・レコード内の各列の値は、複雑なロジックの基準にできます。返される値の文字形式を指定できます。

ユーザー・イグジットの文字セッションが、SET_SESSION_CHARSETを使用して、オペレーティング・システムのデフォルトのキャラクタ・セット以外の値に設定されている場合、ucharset.hファイルのULIB_CS_DEFAULTで定義されているように、ユーザー・イグジットとプロセス間で交換される文字データは、セッションのキャラクタ・セットで解釈されます。

次に該当する場合、列値はセッションのキャラクタ・セットにのみ設定されます。

  • 列値がSQL文字型(CHAR/VARCHAR2/CLOBNCHAR/NVARCHAR2/NCLOB)、SQL日付/タイムスタンプ/間隔/数値型である。

  • column_value_modeインジケータがEXIT_FN_CNVTED_SESS_CHAR_FORMATに設定されている。

構文

#include "usrdecs.h"
short result_code;
column_def column;
ERCALLBACK (GET_COLUMN_VALUE_FROM_INDEX, &column, &result_code);

バッファ

typedef struct
{
char *column_value;
unsigned short max_value_length;
unsigned short actual_value_length;
short null_value;
short remove_column;
short value_truncated;
short column_index;
char *column_name;
/* Version 3 CALLBACK_STRUCT_VERSION */
short column_value_mode;
short source_or_target;
/* Version 2 CALLBACK_STRUCT_VERSION */
char requesting_before_after_ind;
char more_lob_data;
/* Version 3 CALLBACK_STRUCT_VERSION  */
ULibCharSet column_charset;
} column_def;

入力

column_value

返された列値を受け付けるバッファへのポインタ。

max_value_length

返される列値の最大長。通常、最大長は列値バッファの長さです。column_value_modeでASCIIフォーマットが指定される場合、列値はNULLで終了し、最大長は列値の最大長と同じになるはずです。

column_index

返される列値の列索引。

column_value_mode

列値のフォーマットを示します。

EXIT_FN_CHAR_FORMAT

ASCIIフォーマット: 値は、NULLで終了しているASCII (またはEBCDIC)文字列です(既知の例外としてサブデータ型UTF16_BEがあり、これはUTF8に変換されます)。

注意:

列値は、ASCII文字列として解釈され、NULLで終了する必要があるため、ユーザー・イグジットに示される際に切り捨てられる可能性があります。最初の0の値は、文字列の終了文字になります。

  • 日付はCCYY-MM-DD HH:MI:SS.FFFFFFのフォーマットで、時間の端数はデータベースに依存します。

  • 数値は文字列フォーマットです。たとえば、123.45"123.45"として表されます。

  • 出力不可能な文字またはバイナリ値は、16進表記法に変換されます。

  • 浮動小数点型は、有効桁数が最初の14桁までのNULL終了文字列として出力されます。

EXIT_FN_RAW_FORMAT

内部Oracle GoldenGate正規フォーマット: このフォーマットには、適切な場合に、2バイトのNULLインジケータおよび2バイトの変数データ長が含まれます。文字データ型の場合、Oracle GoldenGateではこのフォーマットへのキャラクタ・セットの変換は実行されません。

EXIT_FN_CNVTED_SESS_CHAR_FORMAT

ユーザー・イグジットのキャラクタ・セット: これが適用されるのは、列のデータ型が次の場合のみです。

  • シングルバイトまたはマルチバイトの文字ベースの型

  • 文字列で表現する数値型

このフォーマットはNULLで終了しません。

source_or_target

列値の取得にソースまたはターゲット・データ・レコードのどちらを使用するかを示す次の一方。

EXIT_FN_SOURCE_VAL
EXIT_FN_TARGET_VAL
requesting_before_after_ind

アフター・イメージ・レコードの処理中に、更新または主キー更新のビフォア・イメージ列値を必要とする場合に設定します。

主キー更新または通常の(非キー)更新レコードの"アフター・イメージ"を処理中に、列の"ビフォア"値を取得するには、requesting_before_after_indフラグをBEFORE_IMAGE_VALに設定します。

  • 主キー更新のキー列のビフォア・イメージにアクセスする場合は、他の設定は不要です。

  • 主キー更新の非キー列または通常の更新の任意の列にアクセスするには、ビフォア・イメージが使用可能である必要があります。

requesting_before_after_indの入力が明示的に指定されていない場合、デフォルト設定はAFTER_IMAGE_VAL (列のアフター・イメージの取得)です。

ビフォア・イメージを使用可能にするには、GETUPDATEBEFORESパラメータを使用するか、CUSEREXITパラメータ文内のINCLUDEUPDATEBEFORESオプションを使用します。

次の点に注意してください。

  • GETUPDATEBEFORESを使用すると、Extractプロセスはトレイルにビフォア・イメージを書き込み、ビフォア・イメージを使用してユーザー・イグジットへのEXIT_CALL_PROCESS_RECORDコールも行います。

  • INCLUDEUPDATEBEFORESを使用すると、ユーザー・イグジットへのEXIT_CALL_PROCESS_RECORDコールは行われず、Extractの場合はトレイルへのビフォア・イメージの書き込みも行われません。

requesting_before_after_ind

列のビフォア・イメージを取得するには、char requesting_before_after_indフラグをBEFORE_IMAGE_VALに設定します。アフター・イメージを取得するには、AFTER_IMAGE_VALに設定します。デフォルトは、ビフォアが指定されないかぎり、アフター・イメージで動作します。

ビフォア・イメージを使用可能にするには、表を含むTABLE文でGETUPDATEBEFORESパラメータを使用するか、CUSEREXITパラメータ文内のINCLUDEUPDATEBEFORESオプションを使用します。どちらも、process_recordのユーザー・イグジットへの同じ呼出しが発生します。

出力

column_value

返される列値へのポインタ。column_value_modeEXIT_FN_CHAR_FORMATとして指定されている場合、列値はNULLで終了するASCII文字列として返され、それ以外の場合は内部正規フォーマットで返されます。ASCIIフォーマットの場合、日付は次のフォーマットで返されます。

YYYY-MM-DD HH:MI:SS.FFFFFF

秒の端数が含まれるかどうかは、データベースに依存します。

actual_value_length

返される列名の文字列長(バイト)。column_value_modeEXIT_FN_CHAR_FORMATとして指定されている場合、実際の長さにNULL終了文字は含まれません。

null_value

列値がNULLかどうかを示すフラグ(0または1)。null_valueフラグが1の場合、列値バッファはNULLバイトで埋められます。

value_truncated

値が切り捨てられたかどうかを示すフラグ(0または1)。切捨ては、列値の長さが最大バッファ長を超えるときに行われます。column_value_modeEXIT_FN_CHAR_FORMATとして指定されている場合は、列長にNULL終了文字が含まれます。

char more_lob_data

ベース・レコードに保持可能な初期の4Kの制限よりも大きいLOBデータが存在するかどうかを示すフラグ。LOBは、4Kの上限を越えている場合、LOBフラグメントに保持されます。

返される値を保持するために適切な量のメモリーを割り当てる必要があります。Oracle GoldenGateは、通常LOB列のデータに8Kまでアクセスし、ユーザー・イグジットによって割り当てられた量までバッファに格納します。割り当てられた量よりもLOBが大きい場合は、すべてのデータがユーザー・イグジットに送信されるまで、後続のコールバックを使用してすべての列データを取得する必要があります。

データの終端を確認するには、more_lob_dataを検証します。ユーザー・イグジットは、新しい列にアクセスする前に、このフラグをCHAR_NO_VALまたはCHAR_YES_VALに設定します。最初のコールバック後にこのフラグがまだ初期化状態で、CHAR_YES_VALまたはCAR_NO_VALにも設定されていない場合は、次のいずれかに該当します。

  • LOBの処理に十分なメモリーが割り当てられていた。

  • LOBでなかった。

  • ベース・トレイル・レコード・サイズの4Kの制限を越えていなかった。

列がLOBかどうかを確認するために、ソース表メタデータを取得することをお薦めします。

返される値

EXIT_FN_RET_BAD_COLUMN_DATA
EXIT_FN_RET_COLUMN_NOT_FOUND
EXIT_FN_RET_INVALID_COLUMN
EXIT_FN_RET_INVALID_CONTEXT
EXIT_FN_RET_INVALID_PARAM
EXIT_FN_RET_OK