説明
GET_COLUMN_VALUE_FROM_NAME
ファンクションでは、指定する列名を使用して、データ・レコードから列値を取得します。列値は、ユーザー・イグジット内のほとんどのロジックの基本です。データ・レコード内の各列の値は、複雑なロジックの基準にできます。
ユーザー・イグジットの文字セッションが、SET_SESSION_CHARSET
を使用して、オペレーティング・システムのデフォルトのキャラクタ・セット以外の値に設定されている場合、ucharset.h
ファイルのULIB_CS_DEFAULT
で定義されているように、ユーザー・イグジットとプロセス間で交換される文字データは、セッションのキャラクタ・セットで解釈されます。
次に該当する場合、列値はセッションのキャラクタ・セットにのみ設定されます。
列値がSQL文字型(CHAR/VARCHAR2/CLOB
、NCHAR/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_NAME, &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
返される列値の最大長。通常、最大長は列値バッファの長さです。ASCIIフォーマットが指定された場合(column_value_mode
を参照)、列値はNULLで終了し、最大長は列値の最大長と同じになります。
column_name
返される列値の列名。
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の場合はトレイルへのビフォア・イメージの書き込みも行われません。
出力
column_value
返される列値へのポインタ。column_value_mode
がEXIT_FN_CHAR_FORMAT
として指定されている場合、列値はNULLで終了するASCII文字列として返され、それ以外の場合は内部正規フォーマットで返されます。ASCIIフォーマットの場合、日付は次のフォーマットで返されます。
CCYY-MM-DD HH:MI:SS.FFFFFF
秒の端数が含まれるかどうかは、データベースに依存します。
actual length
返される列名の文字列長。column_value_mode
がEXIT_FN_CHAR_FORMAT
として指定されている場合、実際の長さにNULL終了文字は含まれません。
null_value
列値がNULLかどうかを示すフラグ(0
または1
)。null_value
フラグが1
の場合、列値バッファはNULLバイトで埋められます。
value_truncated
値が切り捨てられたかどうかを示すフラグ(0
または1
)。切捨ては、列値の長さが最大バッファ長を超えるときに行われます。column_value_mode
がEXIT_FN_CHAR_FORMAT
として指定されている場合は、列長にNULL終了文字が含まれます。
char more_lob_data
ベース・レコードに保持可能な初期の4Kの制限よりも大きいLOBデータが存在するかどうかを示すフラグ。LOBは、4Kの上限を越えている場合、LOBフラグメントに保持されます。
返される値を保持するために適切な量のメモリーを割り当てる必要があります。Oracle GoldenGateは、通常LOB列のデータに8Kまでアクセスし、ユーザー・イグジットによって割り当てられた量までバッファに格納します。割り当てられた量よりもLOBが大きい場合は、すべてのデータがユーザー・イグジットに送信されるまで、後続のコールバックを使用してすべての列データを取得する必要があります。
データの終端を確認するには、more_lob_data
を検証します。ユーザー・イグジットは、新しい列にアクセスする前に、このフラグをCAR_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
例
memset (&col_meta, 0, sizeof(col_meta)); if (record.mapped) col_meta.source_or_target = EXIT_FN_TARGET_VAL; else col_meta.source_or_target = EXIT_FN_SOURCE_VAL; col_meta.source_or_target = EXIT_FN_SOURCE_VAL; col_meta.column_name = (char *)malloc(100); col_meta.max_name_length = 100; col_meta.column_index = 1; call_callback (GET_COL_METADATA_FROM_NAME, &col_meta, &result_code);