8 データのマッピングおよび操作

この章では、ソース表とターゲット表のデータを統合する方法について説明します。

内容は次のとおりです。

自己記述型の証跡の使用のガイドライン

SOURCEDEFS OVERRIDEまたはTARGETDEFS OVERRIDEを使用していない場合、証跡ファイル形式が12.2以上であれば、自己記述型の証跡ファイルがデフォルトになります。Oracleでは自己記述型の証跡ファイルを使用することをお薦めします。SOURCEDEFS OVERRIDEおよびTARGETDEFS OVERRIDEは、下位互換性の要件にのみ使用する必要があります。

自己記述型の証跡を使用するためのガイドラインを次に示します。

  • 自己記述型の証跡を使用している場合、ソースの列名がターゲット表の列名にマップされます。列の順序は重要ではなく、列名が異なる場合は、COLMAPを使用して明示的にマップする必要があります。

  • ソースのOracle GoldenGateリリースが12.1以前の場合は、SOURCEDEFS OVERRIDEまたはTARGETDEFS OVERRIDEを使用する必要があります。『Oracle GoldenGateリファレンス』SOURCEDEFS OVERRIDEおよびTARGETDEFS OVERRIDEを参照してください。

マッピングおよびデータ統合を制御するパラメータ

Oracle GoldenGateで実行されるデータの選択、マッピングおよび操作は、すべてTABLEパラメータおよびMAPパラメータのオプションを1つ以上使用して行われます。

  • Extractパラメータ・ファイルでTABLEを使用します。

  • Replicatパラメータ・ファイルでMAPを使用します。

TABLEMAPは、パラメータ・ファイル内の他のパラメータに影響を受けるデータベース・オブジェクトを指定します。これらのパラメータによるオブジェクト名指定の詳細は、「Oracle GoldenGateの入力におけるオブジェクト名の指定」を参照してください。

異なるデータベース間のマッピング

異なるデータ構造を持つ表どうしのマッピングおよび変換には、ソース定義ファイルまたはターゲット定義ファイル、あるいは(一定の場合)その両方が必要です。異なるデータベース間のマッピングは、ソース列またはターゲット列のデータ型に関係なく、自己記述型の証跡によって制御され、マッピングは列名によって実行されます。

自己記述型の証跡に基づく自動マッピングを行わない場合、または下位互換性が必要な場合は、SOURCEDEFSまたはTARGETDEFSを使用します。

データのマッピングおよび変換の実行場所の決定

計画中の構成が大量の列マッピングまたはデータ変換を伴う場合は、次のガイドラインに従って、それらの機能をどのプロセスで実行するかを判断してください。

WindowsシステムとUNIXシステムでのマッピングおよび変換

Oracle GoldenGateがWindowsベースおよびUNIXベースのシステムでのみ動作している場合、列のマッピングおよび変換をExtractプロセスまたはReplicatプロセスで実行できます。Extractプロセスでこの処理に追加のオーバーヘッドが発生するのを防止するため、マッピングおよび変換がReplicatプロセスまたは中間システムで実行されるように構成できます。

複数のソースに対して1つのターゲットがある場合、状況によってはソースでマッピングと変換を実行すると効率が向上することがあります。

NonStopシステムでのマッピングおよび変換

WindowsシステムまたはUNIXシステムからNonStop Enscribeターゲットへのデータのマッピングまたは変換を行う場合、マッピングまたは変換はソースのWindowsシステムまたはUNIXシステムで実行する必要があります。NonStop用のReplicatは、3つまたは2つの部分からなるSQL表名およびデータ型を、Enscribeプラットフォームで使用される3つの部分からなるファイル名に変換できません。Extractは、証跡データをEnscribeの名前およびターゲット・データ型でフォーマットできます。

データ・マッピング時のグローバリゼーションに関する考慮事項

データベースとプラットフォームの間のデータのマッピングおよび変換を計画する際には、グローバリゼーションに関してOracle GoldenGateでサポートされている処理とサポートされていない処理を考慮してください。これらの考慮事項には、次のトピックが含まれます。

文字セット間の変換

ロケールの維持

エスケープ・シーケンスのサポート

文字セット間の変換

Oracle GoldenGateでは、ソースとターゲットの文字セットが異なると、オブジェクト名および列データがデータベース間で正しく比較、マップ、操作されるようにするため、文字セットの変換が行われます。サポートされる文字セットのリストは、サポートされる文字セットを参照してください。

異なるデータベースの間で文字が正確に表現されるためには、次の条件を満たす必要があります。

  • ターゲット・データベースの文字セットは、ソース・データベースの文字セットのスーパーセットであるか、ソース・データベースの文字セットと同等である必要があります。同等とは、同一であることではなく、同じ文字のセットが存在することを意味します。たとえば、Shift-JISとEUC-JPは、厳密に言うと完全に同一ではありませんが、ほとんどの場合に同じ文字が存在します。

  • クライアント・アプリケーションで異なる文字セットが使用されている場合、データベースの文字セットがクライアント・アプリケーションの文字セットのスーパーセットであるか、クライアント・アプリケーションの文字セットと同等であることも必要です。

  • Oracleを含む多くのデータベースで、文字セットに含まれない文字をデータベースに強制的に入力できます。Oracle GoldenGateでは、これは無効な値とみなされ、データのレプリケート時にこの文字を正しくマップしない場合があります。このような状況では、『Oracle GoldenGateリファレンス』の説明に従って、REPLACEBADCHARパラメータを使用できます。

この構成では、クライアントまたはソースの文字セットからローカル・データベースの文字セットへの変換時に、すべての文字が表現されます。

Replicatプロセスは、1つのソース文字セットから1つのターゲット文字セットへの変換をサポートできます。

データベース・オブジェクト名

Oracle GoldenGateでは、カタログ、スキーマ、表および列の名前は、ソース・データベースおよびターゲット・データベースの文字セット・エンコーディングに従って、ネイティブ言語で処理されます。このサポートにより、データベース階層のあらゆるレベルで、シングルバイトおよびマルチバイトの名前、記号、アクセント文字、大/小文字の区別が維持され、ロケールがあればそれも考慮されます。

列データ

Oracle GoldenGateでは、データが次のタイプの列に格納されている場合、文字セット間での列データの変換がサポートされます。

  • 文字型の列: CHAR/VARCHAR/CLOBから別の文字セットのCHAR/VARCHAR/CLOBへの変換、およびCHAR/VARCHAR/CLOBNCHAR/NVARCHAR/NCLOBとの間の変換。

  • 文字列ベースの数値および日時データを含む列。z/OSのEBCDICデータとz/OS以外のASCIIデータの間では、これらの列の変換が実行されます。このデータのASCII版とASCII版の間、およびEBCDIC版とEBCDIC版の間では、データに互換性があるため、変換は実行されません。

    ノート:

    Oracle GoldenGateでは、0001-01-03 00:00:00から9999-12-31 23:59:59までのタイムスタンプ・データがサポートされます。タイムスタンプがGMTからローカル時間に変換されると、これらの制限も変換後のタイムスタンプに適用されます。ゼロの月、ゼロの日のフィールドまたはすべてゼロの日付の値はサポートされていません。たとえば、0000-00-00 00:00:00などの値や、ゼロの月またはゼロの日のフィールドを含む任意の日付値はサポートされていません。

列データの文字セット変換は、ReplicatのMAPパラメータのCOLMAP句またはUSEDEFAULTS句のソース列とターゲット列との直接マッピングに限定されています。直接マッピングは、ストアド・プロシージャや列変換関数を使用しない、名前から名前へのマッピングです。Replicatは、文字セット変換を実行します。Extractやデータ・ポンプでは変換は実行されません。

ロケールの維持

Oracle GoldenGateでは、大/小文字が区別されないオブジェクト名の比較時に、データベースのロケールが考慮されます。サポートされるロケールのリストは、サポートされるロケールを参照してください。

エスケープ・シーケンスのサポート

Oracle GoldenGateでは、パラメータ・ファイルで文字の列、リテラル・テキストまたはオブジェクト名を表すためのエスケープ・シーケンスの使用がサポートされています。エスケープ・シーケンスは、オペレーティング・システムで必要な文字(制御文字など)がサポートされていない場合に、またはパラメータ・ファイルで使用できない文字が必要になるその他の目的のために使用できます。

エスケープ・シーケンスは、パラメータ・ファイルの任意の場所で使用できますが、TABLE文またはMAP文の次の要素で特に便利です。

  • オブジェクト名

  • WHERE

  • Unicode列にUnicode文字を割り当てるか、列にネイティブ・エンコーディングされた文字を割り当てるCOLMAP

  • COLMAP句内のOracle GoldenGateの列変換関数

Oracle GoldenGateでは、次のタイプのエスケープ・シーケンスがサポートされます。

  • \uFFFF: Unicodeエスケープ・シーケンス。サロゲート・ペアを除き、任意のUNICODEコード・ポイントを使用できます。

  • \377: 8進エスケープ・シーケンス

  • \xFF: 16進エスケープ・シーケンス

次のルールが適用されます。

  • TABLEまたはMAPでオブジェクト名のマッピングに使用する場合、制限は何もありません。たとえば、次のTABLE指定は有効です。

    TABLE schema."\u3000ABC";
    
  • 列マッピング関数とともに使用する場合、任意のコード・ポイントを使用できますが、対象となるのはNCHAR/NVARCHAR列のみです。CHAR/VARCHAR列の場合、コード・ポイントは7ビットASCIIと同等のものに限定されます。

  • ソースとターゲットのデータ型は、同一である必要があります(NCHARNCHARなど)。

  • 各エスケープ・シーケンスは、逆斜線(コード・ポイントU+005C)で始め、次に文字コード・ポイントを続けます。(逆斜線は、一般的にはバックスラッシュ記号と呼ばれます。)パラメータ文または列変換関数の入力文字列内で、実際の文字のかわりにエスケープ・シーケンスを使用します。

ノート:

パラメータ・ファイルで実際のバックスラッシュを指定するには、二重のバックスラッシュを指定します。たとえば、COL1: @STRFIND (COL1, '\\' )と指定すると、バックスラッシュが検索されます。

\uFFFF Unicodeエスケープ・シーケンスを使用する手順

  • \uFFFF Unicodeエスケープ・シーケンスは小文字のuで始め、次に正確に4桁の16進数を続ける必要があります。

  • サポートされる範囲は次のとおりです。

    • 0から9 (U+0030からU+0039)

    • AからF (U+0041からU+0046)

    • aからf (U+0061からU+0066)

\u20acは、ユーロ通貨記号のUnicodeエスケープ・シーケンスです。

ノート:

信頼できるクロス・プラットフォーム・サポートのために、Unicodeエスケープ・シーケンスを使用してください。8進および16進のエスケープ・シーケンスは、異なるオペレーティング・システムでは標準化されていません。

\377 8進エスケープ・シーケンスを使用する手順

  • 正確に3桁の8進数が含まれる必要があります。

  • サポートされる範囲:

    • 1桁目の範囲は0から3 (U+0030からU+0033)

    • 2桁目と3桁目の範囲は0から7 (U+0030からU+0037)

      \200は、Microsoft Windowsでのユーロ通貨記号の8進エスケープ・シーケンスです。

\xFF 16進エスケープ・シーケンスを使用する手順

  • 小文字のxで始め、次に正確に2桁の16進数を続ける必要があります。

  • サポートされる範囲:

    • 0から9 (U+0030からU+0039)

    • AからF (U+0041からU+0046)

    • aからf (U+0061からU+0066)

\x80は、Microsoft Windows 1252 Latin1コード・ページのユーロ通貨記号を表す16進エスケープ・シーケンスです。

TABLEおよびMAPを使用した列のマッピング

Oracle GoldenGateでは、表レベルおよびグローバル・レベルの列マッピングが提供されます。明示的な列マッピング・ルールがない場合は、デフォルトの列マッピングも提供されます。

この項には、次のような列マッピング・ガイドラインがあります。

内容は次のとおりです。

列名での大/小文字の区別および特殊文字のサポート

Oracle GoldenGateでの列名とリテラルの指定は、デフォルトで、SQL-92ルールに従います。大/小文字を区別するために二重引用符が必要になるデータベースの場合は、Oracle GoldenGateパラメータ・ファイル、変換関数、ユーザー・イグジットおよびコマンドにおいて、大/小文字を区別する列名を二重引用符で囲む必要があります。大/小文字を区別するために引用符が必要ないその他のデータベースの場合は、大/小文字が区別される列名を、データベースに格納されているとおりに指定する必要があります。リテラルは一重引用符で囲む必要があります。詳細は、大/小文字が区別される列名とリテラルの区別を参照してください。

COLMAPによる表レベルの列マッピングの構成

自己記述型の証跡を使用している場合、ソース・オブジェクトの列は、ターゲット・オブジェクトの同じ列名にマップされます。列名がソースとターゲット間で異なる場合、または列を変換する必要がある場合にのみ、列名を管理する必要があります。

ただし、自己記述型の証跡を使用していない場合、デフォルトのマッピングは列の順序によって行われ、列名では行われません。そのため、ソースの列1はターゲットの列1に、ソースの列2はターゲットの列2にマッピングされます。

MAPおよびTABLEパラメータのCOLMAPオプションを使用して、次の処理を実行します。

  • 異なる名前を持つターゲット列に個別のソース列をマップします。

  • 明示的な列マッピングが不要な場合、デフォルトの列マッピングを指定します。

  • ソース列からターゲット列に対してデータを選択、マップ、変換および移動するための指示を提供します。

内容は次のとおりです。

USEDEFAULTSを使用したデフォルトの列マッピングの有効化

COLMAPのUSEDEFAULTSオプションを使用すると、ソース列と対応するターゲット列の名前が同一の場合に、自動デフォルト列マッピングを指定できます。USEDEFAULTSを使用すると、すべてのターゲット列を明示的にマップする必要がないので、時間を節約できます。

デフォルト・マッピングの場合、Oracle GoldenGateはそれらの列をマッピングし、必要な場合は、データ型を、データ定義ファイルに基づいて変換します(unresolvable-reference.htmlを参照)。明示的なマッピング文でマップされている列にはデフォルト・マッピングを指定しないでください。

次の列マッピングの例では、 ソース表ACCTBLとターゲット表ACCTTABのデフォルト列マッピングと明示的な列マッピングの使用について示します。両方の表の大半の列は同じで、次の点が異なります。

  • ソース表にはCUST_NAME列がありますが、ターゲット表にはNAME列があります。

  • ソース表の10桁のPHONE_NO列は、ターゲット表の個別のAREA_CODE列、PHONE_PREFIX列およびPHONE_NUMBER列に対応します。

  • ソース表の個別のYY列、MM列およびDD列は、ターゲット表の単一のTRANSACTION_DATE列に対応します。

これらの相違点に対処するため、USEDEFAULTSを使用して同じ列を自動的にマップし、異なる列には明示マッピングおよび変換関数を使用します。

次のサンプルは、MAPパラメータとTABLEパラメータのCOLMAPオプションを使用した列マッピングを示しています。ソース表ACCTBLからターゲット表ACCTTABへのマッピングについて説明します。

MAP SALES.ACCTBL, TARGET SALES.ACCTTAB,
                COLMAP (   USEDEFAULTS,
                           NAME = CUST_NAME,
                           TRANSACTION_DATE = @DATE ('YYYY-MM-DD', 'YY',YEAR, 'MM', MONTH, 'DD', DAY),
                           AREA_CODE = @STREXT (PHONE_NO, 1, 3),
                           PHONE_PREFIX = @STREXT (PHONE_NO, 4, 6),
                           PHONE_NUMBER = @STREXT (PHONE_NO, 7, 10)
)
;

表8-1 サンプルの列マッピング

パラメータ文 説明
COLMAP(

COLMAP文を開始します。

USEDEFAULTS,

ターゲット列の名前が同一の場合、ソース列をそのままマップします。

NAME = CUST_NAME,

ソース列CUST_NAMEをターゲット列NAMEにマップします。

TRANSACTION_DATE =
@DATE ('YYYY-MM-DD', 'YY', YEAR, 'MM', MONTH, 'DD', DAY),

@DATE列変換関数を使用して、ソースの日付列からターゲット列TRANSACTION_DATEにトランザクション日付を変換します。

AREA_CODE =
@STREXT (PHONE_NO, 1, 3),
PHONE_PREFIX =
@STREXT (PHONE_NO, 4, 6),
PHONE_NUMBER =
@STREXT (PHONE_NO, 7, 10))
;

@STREXT列変換関数を使用して、ソース列PHONE_NOを別々のターゲット列AREA_CODEPHONE_PREFIXおよびPHONE_NUMBERに変換します。

デフォルトの列マッピングでOracle GoldenGateが従うルールの詳細は、「デフォルトの列マッピングの理解」を参照してください。

COLMAP句でマップされる列の指定

COLMAPの構文は次のとおりです。

COLMAP ([USEDEFAULTS, ] target_column = source_expression)

この構文でtarget_columnはターゲット列の名前とsource_expressionです。source_expressionsの例を次に示します。

  • ソース列の名前(ORD_DATEなど)。

  • 数値定数(123など)。

  • 一重引用符で囲まれた文字列定数('ABCD'など)。

  • Oracle GoldenGate列変換関数を使用する式。COLMAP文内で、Oracle GoldenGate列変換関数のいずれかを使用して、マップされた列のデータを変換できます。たとえば:

    @STREXT (COL1, 1, 3)
     
  • BEFORE column_nameの使用例を示します。BEFORE ORD_DATE

  • AFTER column_nameの使用例を示します。AFTER ORD_DATE。列名がリストされている場合、これがデフォルトのオプションです。

列マッピングに、異なるデータベース・タイプに由来する、大/小文字が区別される複数の列が関係する場合、各列を、データベースに格納されているとおりに指定してください。

  • 大/小文字を区別するために二重引用符が必要になるデータベースの場合は、大/小文字が区別される列名を二重引用符で囲んで指定してください。

  • 大/小文字は区別されるが二重引用符が必要ないデータベースの場合は、列名を、データベースに格納されているとおりに指定してください。

次は、Oracleデータベースのターゲット列と、大/小文字が区別されるSQLサーバー・データベースのソース列との間でのマッピングを示しています。

COLMAP ("ColA" = ColA)

Oracle GoldenGateへの名前の指定の詳細は、「Oracle GoldenGateの入力におけるオブジェクト名の指定」を参照してください。

文字セットとロケールが異なるデータベース間でソース列とターゲット列をマップする場合のグローバリゼーションに関する考慮事項については、「データ・マッピング時のグローバリゼーションに関する考慮事項」を参照してください。

COLMAPを使用してキー列に値をマップ(主キーの更新操作が発生)しないでください。Oracle GoldenGateがターゲット行の特定に使用するWHERE句では、キー列の正しい変更前イメージが使用されません。かわりに、変更後イメージが使用されます。このため、SQLEXEC文などのキー列に基づく関数を使用している場合、エラーになります。

列マッピングの制限

列マッピングの制限は次のとおりです。
  • LOB列は、FILTER列、WHERE列、またはCOLMAP文のsource_expressionとしては使用できません。LOB列は、BLOBCLOBNCLOBXMLType、ユーザー定義データ型、ネストした表、VARRAYsおよびその他の特別なデータ型です。

  • ソース列に4000バイトを超える値が含まれる場合、値はLOBレコードとして証跡に格納されるため、変換ルーチンでこの列を使用することはできません。たとえば、OracleのVARCHAR2(4000 CHAR)と日本語の文字セットは、それぞれの文字を3バイトとして保存します。これは、列の長さが12000バイトになり、Oracle GoldenGateではこの値がLOBフィールドとして格納されることを意味します。

  • Oracle GoldenGateが実行する完全な全SQL文のサイズは、4MBを超えます。たとえば、数千のVARCHAR2(4000)列を持つ表があり、それぞれに4000バイトを配置する場合、Oracle GoldenGateで実行される合計のSQL文が、最大サイズの4MBを超える可能性があります。

COLMATCHによるグローバル列マッピングの構成

COLMATCHパラメータでは、列マッピングのグローバル・ルールを作成します。COLMATCHでは、同じデータセットに対して異なる列名を持つ類似した構造の表どうしをマップできます。このタイプの列をマップする場合、個別のTABLE文またはMAP文のCOLMAP句で表レベルのマッピングを使用するより、COLMATCHの方が簡単です。

大/小文字の区別は次のようにサポートされます。

  • MySQL、SQL ServerおよびTeradataの場合、データベースの大/小文字が区別されるときは、COLMATCHでは、名前が引用符で囲まれて指定されているかどうかにかかわらず、大/小文字と名前が完全に一致するものが検索されます。

  • 同じデータベース内で名前の大/小文字を区別することも区別しないことも可能なOracle DatabaseおよびDB2データベースで、大/小文字を区別するために二重引用符が必要になる場合、COLMATCHでは、名前が引用符で囲まれているとき、大/小文字と名前がデータベースと完全に一致することが求められます。

構文

COLMATCH
{NAMES target_column = source_column |
PREFIX prefix |
SUFFIX suffix |
RESET}
引数 説明
NAMES target_column = source_column

列名に基づいてマップします。

列名で大/小文字が区別され、データベースで大/小文字が区別されるために引用符が必要な場合、列名を二重引用符で囲みます。これらのデータベース・タイプでは、Oracle GoldenGateは、引用符で囲まれていない列名を大/小文字の区別がされないものとして扱います。

大/小文字の区別はサポートしているが引用符が必要ないデータベースの場合は、列名を、データベースに格納されているとおりに指定してください。

COLMATCHがデータベース・タイプが異なる列に適用される場合、それぞれの名前で大/小文字の区別が適切に表現されていることを確認してください。たとえば、次の例では、Oracle Database内の大/小文字が区別されるターゲット列名"aBc"と、大/小文字が区別されるSQL Serverデータベース内の、大/小文字が区別されるソース列名aBcを指定しています。

COLMATCH NAMES "aBc" = aBc
PREFIX prefix | SUFFIX suffix

指定した名前接頭辞または名前接尾辞を無視します。

データベースで大/小文字が区別されるために引用符が必要な場合、接頭辞または接尾辞を二重引用符で囲みます。たとえば、"P_"です。それらのデータベース・タイプでは、引用符で囲まれていない接頭辞または接尾辞を大/小文字の区別がされないものとして扱います。

大/小文字の区別はサポートしているが引用符が必要ないデータベースの場合は、接頭辞または接尾辞を、データベースに格納されているとおりに指定してください。たとえば、P_は、大文字の接頭辞Pを指定しています。

次の例では、大/小文字が区別されない接頭辞を無視するよう指定しています。ターゲット列名P_ABCはソース列名ABCにマップされ、ターゲット列名P_abcはソース列名abcにマップされます。

COLMATCH PREFIX p_

次の例では、大/小文字が区別されるsuffixを無視するよう指定しています。ターゲット列名ABC_kはソース列名ABCにマップされ、ターゲット列名"abc_k"はソース列名"abc"にマップされます。

SUFFIX "_k"
RESET

前に定義したCOLMATCHルールを、後続のTABLE文またはMAP文で無効化します。

次の例は、COLMATCHを使用するタイミングを示しています。ソース表とターゲット表は、表名と列名がわずかに異なることを除いて同一です。データベースでは大文字と小文字が区別されません。

ACCT表 ORD表
CUST_CODE
CUST_NAME
CUST_ADDR
PHONE
S_REP
S_REPCODE
CUST_CODE
CUST_NAME
ORDER_ID
ORDER_AMT
S_REP
S_REPCODE
ACCOUNT表 ORDER表
CUSTOMER_CODE
CUSTOMER_NAME
CUSTOMER_ADDRESS
PHONE
REP
REPCODE
CUSTOMER_CODE
CUSTOMER_NAME
ORDER_ID
ORDER_AMT
REP
REPCODE

この例でソース列をターゲット列にマップし、同時に他の表で後続のマップを処理するには、次の構文を使用します。

COLMATCH NAMES CUSTOMER_CODE = CUST_CODE
COLMATCH NAMES CUSTOMER_NAME = CUST_NAME
COLMATCH NAMES CUSTOMER_ADDRESS = CUST_ADDR
COLMATCH PREFIX S_
MAP SALES.ACCT, TARGET SALES.ACCOUNT, COLMAP (USEDEFAULTS);
MAP SALE.ORD, TARGET SALES.ORDER, COLMAP (USEDEFAULTS);
COLMATCH RESET
MAP SALES.REG, TARGET SALE.REG;
MAP SALES.PRICE, TARGET SALES.PRICE;

この例のルールに基づいて、次の処理が発生します。

  • データは、ソースのACCT表およびORD表のCUST_CODE列から、ターゲットのACCOUNT表およびORDER表のCUSTOMER_CODE列にマップされます。

  • S_接頭辞は無視されます。

  • PHONE列やORDER_AMT列などの同じ名前を持つ列は、明示的なルールを必要とすることなく、USEDEFAULTSによって自動的にマップされます。詳細は、「デフォルトの列マッピングの理解」を参照してください。

  • 前述のグローバル列マッピングは、REG表およびPRICE表では無効化されます。これらの表のソース列とターゲット列は、名前がすべて同一であるため、自動的にマップされます。

デフォルトの列マッピングの理解

自己記述型の証跡ファイルについて、COLMATCHまたはCOLMAPを使用した明示的な列マッピングが存在しない場合、Oracle GoldenGateでは、デフォルトで次のルールに従ってソース列とターゲット列がマップされます。

これは、SOURCEDEFSまたはTARGETDEFSを使用している場合は当てはまりません。

  • ソース列の名前および大/小文字がターゲット列のものと正確に一致することが検出された場合、2つの列はマップされます。

  • 大/小文字が一致しないことが検出された場合、名前のフォールバック・マッピングが使用されます。フォールバック・マッピングでは、大/小文字を区別せずにターゲット表のマッピングを実行して、一致する名前を探します。大文字の名前を使用して、厳密でない列名のマッチングが適用されます。この動作は、GLOBALSパラメータのNAMEMATCHIGNORECASEによって制御されます。名前のフォールバック照合は、NAMEMATCHEXACTパラメータを使用して無効にすることも、NAMEMATCHNOWARNINGパラメータを使用して、有効にしたまま警告メッセージを表示することもできます。

  • どのソース列にも対応していないターゲット列には、データベースによって指定されたデフォルト値が割り当てられます。

デフォルトのマッピングを実行できない場合、ターゲット列は、デフォルトで次の表に示されているいずれかの値になります。

列型

数値

0 (ゼロ)

文字またはVARCHAR

空白

日付または日時

現在の日時

NULL値を使用できる列

NULL

データ型変換

次の例では、Oracle GoldenGateによるデータ型のマップ方法について説明します。

内容は次のとおりです。

数値の列

数値の列は、ターゲット列の型およびスケールと一致するように変換されます。ターゲット列のスケールがソースのスケールより小さい場合、数値の右側が切り捨てられます。ターゲット列のスケールがソースのスケールより大きい場合、数値の右側に0(ゼロ)が埋め込まれます。

REPLACEBADNUMパラメータを使用することで、数字列をマップするときに検出される無効な数字データの代替値を指定できます。詳細は、『Oracle GoldenGateリファレンス』を参照してください。

文字型の列

文字型の列では、VARCHARなどの文字ベースのデータ型、文字列形式の数値、文字列形式の日時、および文字列リテラルを使用できます。ターゲット列のスケールがソースのスケールより小さい場合、列の右側が切り捨てられます。ターゲット列のスケールがソースのスケールより大きい場合、列の右側に空白が埋め込まれます。

リテラルは一重引用符で囲む必要があります。

REPLACEBADCHARパラメータを使用すると、文字の列をマッピングするときにソースまたはターゲットの文字セットに対して有効なコードポイントが存在しない場合、Oracle GoldenGateプロセスのレスポンスを制御できます。詳細は、『Oracle GoldenGateリファレンス』を参照してください。

日時の列

日時(DATETIMEおよびTIMESTAMP)の列では、日時および文字の列に加え、文字列リテラルを使用できます。リテラルは一重引用符で囲む必要があります。文字の列を日時の列にマップする場合、その列がOracle GoldenGateの外部SQL書式であるYYYY-MM-DD HH:MI:SS.FFFFFFに準拠していることを確認します。

Oracle GoldenGateでは、0001-01-03 00:00:00から9999-12-31 23:59:59までのタイムスタンプ・データがサポートされます。タイムスタンプがGMTからローカル時間に変換されると、これらの制限も変換後のタイムスタンプに適用されます。タイムゾーンに応じて、変換により時間が追加または引かれる場合があり、これにより、タイムスタンプがサポートされている上限を超えたり、下回ったりすることがあります。

必要な精度は、データ型およびターゲット・プラットフォームに応じて異なります。ターゲット列のスケールがソースのスケールより小さい場合、データの右側が切り捨てられます。ターゲット列のスケールがソースのスケールより大きい場合、列の右側が現在の日時の値で拡張されます。

行の選択とフィルタリング

フィルタリングはOracle GoldenGateで使用可能な列に対してのみ実行できます。TRANLOG ExtractではOracle GoldenGateは、REDOログおよびデータベース内に存在するすべての列にアクセスできます。列がREDOログにない場合は、列のフィルタを行うために、列を明示的にフェッチする必要があります(FETCHCOLSを使用)。ExtractポンプおよびReplicatでは、これらの列を証跡ファイル内で使用できる必要があります。このため、FILTER句またはWHERE句で使用する列は、ADD TRANDATA COLSを使用して明示的にログに記録する必要があり、デフォルトのLOGALLSUPCOLSを維持する必要があります。

抽出またはレプリケートする行をフィルタで除外または選択するには、TABLEおよびMAPパラメータのFILTER句およびWHERE句を使用します。

WHERE句では基本的なWHERE演算子を使用できますが、FILTER句では、Oracle GoldenGate列変換関数をすべて使用できるため、WHERE句より多くの機能が提供されます。

内容は次のとおりです。

FILTER句を使用した行の選択

FILTER句を使用して、基本演算子または1つ以上のOracle GoldenGate列変換関数により、数値に基づいて行を選択します。

ノート:

文字列に基づいて列をフィルタするには、Oracle GoldenGate文字列関数のいずれかを使用するか、WHERE句を使用します。

TABLE文でのFILTERの構文は次のとおりです。

TABLE source_table,
, FILTER (
[, ON INSERT | ON UPDATE| ON DELETE]
[, IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE]
, filter_clause);

MAP文でのFILTERの構文は次のとおりで、エラー処理オプションがあります。

MAP source_table, TARGET target_table,
, FILTER (
[, ON INSERT | ON UPDATE| ON DELETE]
[, IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE]
[, RAISEERROR error_number]
, filter_clause);

FILTER句の有効な要素は、次のとおりです。

  • Oracle GoldenGate列変換関数。これらの関数は、Oracle GoldenGateに組み込まれており、テストの実行、データの操作、値の取得などを行うことができます。Oracle GoldenGate変換関数の詳細は、「データのテストおよび変換」を参照してください。

  • 数字

  • 数字を含む列

  • 数字を返すファンクション

  • 算術演算子:

    • + (加算)

    • - (減算)

    • * (乗算)

    • / (除算)

    • \ (余り)

  • 比較演算子:

    • > (より大きい)

    • >= (以上)

    • < (より少ない)

    • <= (以下)

    • = (等しい)

    • <> (等しくない)

    • 比較から導出した結果はゼロ(FALSEを示す)またはゼロ以外(TRUEを示す)になります。

  • カッコ(式の結果をグループ化)

  • 結合演算子: ANDOR

次のFILTERオプションを使用して、フィルタ句の影響を受けるSQL操作を指定します。これらのオプションは、任意に結合できます。

ON INSERT | ON UPDATE | ON DELETE  IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE

MAPパラメータのFILTERRAISEERRORオプションを使用して、フィルタに失敗したときのユーザー定義のエラーを生成します。このオプションは、失敗に応じてイベントを起動する必要がある場合に役立ちます。

FILTER句内で@RANGE関数を使用すると、処理のワークロードを複数のMAP文またはTABLE文に分散できます。

次に例を示します。
REPERROR (9999, EXCEPTION)
MAP OWNER.SRCTAB, TARGET OWNER.TARGTAB,
                   SQLEXEC (ID CHECK, ON UPDATE, QUERY ' SELECT COUNT FROM TARGTAB WHERE PKCOL = :P1 ', PARAMS (P1 = PKCOL)),
                   FILTER (BALANCE > 15000),
                   FILTER (ON UPDATE, @BEFORE (COUNT) = CHECK.COUNT)
;
MAP OWNER.SRCTAB, TARGET OWNER.TARGEXC,
EXCEPTIONSONLY, 
COLMAP (   USEDEFAULTS,
ERRTYPE = 'UPDATE FILTER FAILED'
)
;

表8-2 複数のFILTER文の使用

パラメータ・ファイル 説明
REPERROR (9999, EXCEPTION)

指定したエラーに対して例外を起動します。

MAP OWNER.SRCTAB,
TARGET OWNER.TARGTAB,

MAP文を開始します。

SQLEXEC (ID CHECK, ON UPDATE,
QUERY ' SELECT COUNT FROM TARGTAB '
'WHERE PKCOL = :P1 ',
PARAMS (P1 = PKCOL)),

問合せを実行し、更新が発生するたびにCOUNT列の現在の値を取得します。FILTER句を処理する前に問合せまたはストアド・プロシージャを実行できる、BEFOREFILTERオプションもあります。これにより、SQLEXECの部分の値が、実行時にFILTERの内部で使用できるようになります。

FILTER (BALANCE > 15000),

FILTER句を使用して、残高が15000を超える行を選択します。

FILTER (ON UPDATE, @BEFORE (COUNT) = CHECK.COUNT)

別のFILTER句を使用して、更新前のCOUNTソース列の値がターゲットの更新適用前のターゲット列の値と一致することを保証します。

;

セミコロンでMAP文を終了します。

MAP OWNER.SRCTAB,
TARGET OWNER.TARGEXC,
EXCEPTIONSONLY,
COLMAP (USEDEFAULTS,
ERRTYPE = 'UPDATE FILTER FAILED');

例外MAP文を指定します。エラー9999のREPERROR句によって、TARGEXCに対する例外マップが実行されます。

例8-1 @COMPUTE関数のコール

次の例では、@COMPUTE関数をコールして、価格と数量の積が10,000を超えるレコードを抽出します。

MAP SALES.TCUSTORD, TARGET SALES.TORD,
FILTER (@COMPUTE (PRODUCT_PRICE * PRODUCT_AMOUNT) > 10000);

例8-2 @STREQ関数のコール

次の例では、@STREQ関数を使用して、文字列の値が'JOE'であるレコードを抽出します。

TABLE ACCT.TCUSTORD, FILTER (@STREQ ("Name", 'joe') > 0);

例8-3 レコードの選択

次の例では、AMOUNT列が50を超えているレコードを選択し、UPDATEおよびDELETE操作時にフィルタを実行します。

TABLE ACT.TCUSTORD, FILTER (ON UPDATE, ON DELETE, AMOUNT > 50);

例8-4 @RANGE関数の使用

(Replicatグループ1のパラメータ・ファイル)

MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (1, 2, ID));

(Replicatグループ2のパラメータ・ファイル)

MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (2, 2, ID));

Replicatのパラメータ・ファイルの一部を示した表8-2に示すように、1つのMAP文またはTABLE文内に複数のFILTER句を結合できます。Oracle GoldenGateでは、フィルタはいずれか1つが失敗するか、すべてが成功するまでリスト順に実行されます。1つのフィルタが失敗すると、フィルタ全体が失敗します。

WHERE句を使用した行の選択

WHERE句で表8-3の任意の要素を使用し、条件文に基づいて行の選択または除外(あるいはその両方)を行います。各WHERE句は、カッコで囲む必要があります。リテラルは一重引用符で囲む必要があります。

表8-3 許可されているWHERE演算子

要素

列名

PRODUCT_AMT

数値

-123, 5500.123

リテラル文字列

'AUTO', 'Ca'

組込みの列テスト

@NULL@PRESENT@ABSENT (行の列がNULL、存在または欠落)。これらのテストは、Oracle GoldenGateに組み込まれています。「FILTERおよびWHEREを使用して行を選択する場合の考慮事項」を参照してください。

比較演算子

=, <>, >, <, >=, <=

結合演算子

AND, OR

グループ化用カッコ

複数の要素の論理グループ化用に開きカッコと閉じカッコ( )を使用します。

Oracle GoldenGateでは、マルチバイト文字セットまたはローカル・オペレーティング・システムの文字セットと互換性のない文字セットを含む列に対して、FILTERをサポートしていません。

算術演算子および浮動小数点データ型は、WHEREではサポートされません。より複雑な選択条件を使用するには、FILTER句を使用するか、ユーザー・イグジット・ルーチンを使用します。詳細は、「ユーザー・イグジットを使用したOracle GoldenGate機能の拡張」を参照してください。

WHEREの構文は、TABLE文でもMAP文でも同じです。

TABLE table, WHERE (clause);
MAP source_table, TARGET target_table, WHERE (clause);

FILTERおよびWHEREを使用して行を選択する場合の考慮事項

適切な選択句を作成するために、次の推奨事項が役立ちます。

ノート:

この項の例は、大/小文字が区別されないデータベースを想定しています。

フィルタでのデータ使用可能性の確保

データベースで、変更された列の値のみをトランザクション・ログに記録している場合、変更されていない列のいずれかが選択基準によって参照されると、エラーが発生する可能性があります。Oracle GoldenGateは、このような行操作を無視し、それらを破棄ファイルに出力して警告を発行します。

欠落列エラーを回避するには、次のように選択条件を作成します。

  • 可能であれば、選択基準として主キー列のみを使用します。

  • それらの列に対するサプリメンタル・ロギングを有効にして、必要な列値を使用できるようにします。あるいは、TABLEパラメータのFETCHCOLSまたはFETCHCOLSEXCEPTオプションを使用することもできます。これらのオプションは、すべてのサポートされているデータベースに対して有効です。値がログに存在しない場合に、データベースに問い合せて値をフェッチします。FILTER句またはWHERE句が実行される前に値を取得するため、TABLE文のFETCHBEFOREFILTERオプションをFILTER句またはWHERE句の前に指定します。たとえば:

    TABLE DEMO.PEOPLE, FETCHBEFOREFILTER, FETCHCOLS (age), FILTER (age > 50);
    
  • 最初に列が存在するかどうかをテストし、次に列の値をテストします。列が存在するかどうかをテストするには、次の構文を使用します。

    column_name {= | <>} {@PRESENT | @ABSENT}
    

    次の例では、amount列が10,000を超えている場合にすべてのレコードが戻されます。amountが存在しない場合、レコードは破棄されません。

    WHERE (amount = @PRESENT AND amount > 10000)
    
列値の比較

比較で使用される要素が確実に一致するように、該当する列タイプを比較します。

  • 文字の列とリテラル文字列。

  • 数値の列と数値(符号と小数点を含む)。

  • 日時の列とリテラル文字列(アプリケーションによって取得される列の書式を使用)。

NULL値のテスト

列がNULL値であるかどうかを評価するには、次の構文を使用します。

column {= | <>} @NULL

次の例では、列値がNULLの場合にのみTRUEが戻され、行がレプリケートされます。他のすべての場合(レコードから列が欠落している場合を含む)、FALSEを返します。

WHERE (amount = @NULL)

次の例では、列がレコードに存在し、NULLではない場合にのみTRUEが戻されます。

WHERE (amount = @PRESENT AND amount <> @NULL)

ノート:

証跡内の値が4000バイトを超える場合、@NULL関数はTRUEを返します。

変更前の値と変更後の値の取得

更新および削除操作では、ソース列の変更前の値(更新発生前の値)を取得すると役立つことがあります。挿入の場合は、すべての列値が変更後イメージとみなされます。

これらの値は証跡に格納されており、フィルタおよび列マッピングで使用できます。たとえば、次のことが可能です。

  • 例外MAP文における列マッピング指定の一部として、行の変更前イメージを取得し、競合解決ルーチンのテストまたはトラブルシューティング用に、それらの値を例外表にマップします。

  • デルタ計算を実行します。たとえば、表にBalance列が含まれる場合、新しい残高から元の残高を差し引いて特定のトランザクションの正味の結果を計算できます。次に例を示します。

    MAP "owner"."src", TARGET "owner"."targ",
    COLMAP (PK1 = PK1, delta = balance – @BEFORE (balance));
    

    ノート:

    前の例は、Oracleなどの大/小文字が区別されるデータベースを示しています。表名は、大/小文字の区別を表すために引用符で囲まれています。

変更前の値を参照する手順

  1. 次のように、@BEFORE列変換関数と、変更前の値を必要とする列の名前を使用します。

    @BEFORE (column_name)
    
  2. GETUPDATEBEFORESパラメータをExtractのパラメータ・ファイルで使用して、トランザクション・レコードから変更前イメージを取得するか、Replicatのパラメータ・ファイルで使用して、列マッピングまたはフィルタで変更前イメージを使用します。競合の検出および解決(CDR)機能を使用する場合は、TABLEGETBEFORECOLSオプションを使用できます。これらのパラメータを使用するには、すべての列がトランザクション・ログに存在している必要があります。データベースで、変更された列の値のみを記録している場合、@BEFORE関数を使用すると、列の欠落状態が発生し、列がレコードに存在しない場合と同じように列マップが実行されます。列値の使用可能性を確保するには、「フィルタでのデータ使用可能性の確保」を参照してください。

    Oracle GoldenGateには、フィルタリング、変換関数または他の目的で必要な場合に変換後の値を取得する@AFTER関数も用意されています。@BEFOREおよび@AFTERの詳細は、『Oracle GoldenGateリファレンス』を参照してください。

列の選択

Oracle GoldenGateによって抽出するソース表の列を制御するには、TABLEパラメータのCOLSオプションおよびCOLSEXCEPTオプションを使用します。COLSでは抽出する列を選択し、COLSEXCEPTでは、COLSEXCEPTで指定した列以外のすべての列を選択します。

抽出する列を制限すると、ターゲット表にソース表と同じ列が含まれない場合や、列に機密情報(個人識別番号その他の固有のビジネス情報など)が含まれる場合に役立ちます。

SQL操作の選択および変換

デフォルトでは、Oracle GoldenGateによってINSERTUPDATEおよびDELETE操作が取得および適用されます。ExtractまたはReplicatのパラメータ・ファイルで次のパラメータを使用して、処理する操作の種類(挿入のみ、または挿入と更新のみなど)を制御できます。

GETINSERTS | IGNOREINSERTS

GETUPDATES | IGNOREUPDATES

GETDELETES | IGNOREDELETES

Replicatパラメータ・ファイルで次のパラメータを使用すると、あるタイプのSQL操作を別のタイプに変換できます。

  • INSERTUPDATESを使用して、ソースの更新操作をターゲット表への挿入操作に変換します。これは、ターゲット表にトランザクション履歴を保持する場合に便利です。トランザクション・ログ・レコードには、変更された値だけでなく、表の列値もすべて含まれている必要があります。一部のデータベースでは、トランザクション・ログに行の値がすべて記録されず、変更された値のみが記録されます。

  • INSERTDELETESを使用して、ソースのすべての削除操作をターゲット表への挿入操作に変換します。これは、ソース・データベースに存在していたすべてのレコードの履歴を保持する場合に便利です。

  • UPDATEDELETESを使用して、ソースの削除操作をターゲットの更新操作に変換します。

トランザクション履歴の使用

Oracle GoldenGateでは、ターゲット・レコードに対する変更の履歴を保持して、各変更の原因となった操作に関する情報をマップできます。この履歴は、各レコードの最新バージョンのみを含むのではなく、表に対して実行されたすべての操作の個別レコードを含むトランザクションベースのレポート・システムを作成する場合に役立ちます。

たとえば、CUSTOMERという名前のターゲット表に対して行われた次の一連の操作では、ID Daveの履歴は残りません。最後の操作でレコードを削除するため、Daveの口座の履歴や最後の残高を知ることはできません。

表8-4 CUSTOMER表の操作履歴

順序 操作 ID 残高

1

Insert

Dave

1000

2

Update

Dave

900

3

Update

Dave

1250

4

Delete

Dave

1250

一連のレコードとしてこの履歴を保持すると、多くの場面で役立ちます。たとえば、トランザクションの正味の効果を生成できます。

トランザクション・レポートを実装する手順

  1. 変更前の値を取得するようにExtractを準備するため、Extractのパラメータ・ファイルでGETUPDATEBEFORESパラメータを使用します。変更前の値(または変更前イメージ)は、更新が実行される前に列に存在する値です。変更前イメージによって、Oracle GoldenGateでトランザクション・レコードを作成できます。
  2. 挿入としてすべての操作を適用するようにReplicatを準備するため、Replicatのパラメータ・ファイルでINSERTALLRECORDSパラメータを使用します。表に対する各操作は、その表内の新規レコードになります。
  3. トランザクション履歴をマップするため、@GETENV列変換関数のGGHEADERオプションの戻り値を使用します。TABLEパラメータまたはMAPパラメータのCOLMAP文に、ソース式として変換関数を含めます。

表8-4に示されている一連のサンプル・トランザクションを使用して、データベースの最新状態ではなく、よりトランザクション指向の強い顧客ビューを生成するために、次のパラメータ構成を作成できます。

プロセス パラメータ文

Extract

GETUPDATEBEFORES
TABLE ACCOUNT.CUSTOMER;

Replicat

INSERTALLRECORDS
MAP SALES.CUSTOMER, TARGET SALES.CUSTHIST,
COLMAP (TS = @GETENV ('GGHEADER', 'COMMITTIMESTAMP'),
BEFORE_AFTER = @GETENV ('GGHEADER', 'BEFOREAFTERINDICATOR'),
OP_TYPE = @GETENV ('GGHEADER', 'OPTYPE'),
ID = ID,
BALANCE = BALANCE);

ノート:

この例は、Oracle GoldenGateプロセスの完全なパラメータ・ファイルを表していません。これらの例が、大/小文字が区別されないデータベースを表していることにも注意してください。

この構成によって、各トランザクションの正味合計と、トランザクションの時刻および顧客IDを戻す次のような問合せが可能になります。

SELECT AFTER.ID, AFTER.TS, AFTER.BALANCE - BEFORE.BALANCE
FROM CUSTHIST AFTER, CUSTHIST BEFORE
WHERE AFTER.ID = BEFORE.ID AND AFTER.TS = BEFORE.TS AND
AFTER.BEFORE_AFTER = 'A' AND BEFORE.BEFORE_AFTER = 'B';

データのテストおよび変換

データのテストおよび変換は、ExtractまたはReplicatによって実行できます。これらの機能は、Oracle GoldenGateの組込みの列変換関数をTABLE文またはMAP文のCOLMAP句内で使用することで実装します。これらの変換関数では、次の処理を実行できます。

  • 日付の変換。

  • 列値の存在確認のテスト。

  • 算術演算の実行。

  • 数値および文字列の操作。

  • NULL値、無効なデータおよび欠落データの処理。

  • テストの実行。

この章では、データ操作に関連するいくつかのOracle GoldenGate関数の概要について説明します。詳細なリファレンスは、Oracle GoldenGateリファレンスfor Windows and UNIXを参照してください。

Oracle GoldenGate関数で提供される機能の範囲外のロジックを使用する必要がある場合は、Oracle GoldenGateユーザー・イグジットを実装して独自の関数をコールできます。ユーザー・イグジットの詳細は、「ユーザー・イグジットを使用したOracle GoldenGate機能の拡張」を参照してください。

Oracle GoldenGate変換関数の一般的な構文は次のとおりです。

構文

@function (argument)

表8-5 変換関数の構文

構文の要素 説明

@function

Oracle GoldenGate関数の名前。関数名には、接頭辞@が付きます(@COMPUTE@DATEなど)。関数名と入力引数の前にある開き丸カッコの間の空白は、オプションです。

argument

関数の引数。

表8-6 関数の引数

引数の要素

数値定数

123

一重引用符で囲まれた文字列リテラル

'ABCD'

ソース列の名前

PHONE_NO or phone_no, or "Phone_No" or Phone_no

データベースが大/小文字の区別をしないか、大/小文字の区別をするか、大/小文字の区別をする場合に引用符が必要か、大/小文字の区別をする場合に引用符を必要としないかにより異なります。

算術式

COL2 * 100

比較式

((COL3 > 100) AND (COL4 > 0))

他のOracle GoldenGate関数

AMOUNT = @IF (@COLTEST (AMT, MISSING, INVALID), 0, AMT)

関数での列名およびリテラルの処理

デフォルトでは、列変換関数内のリテラル文字列は一重引用符で囲む必要があります。データベースによっては大/小文字を区別する列名を二重引用符で囲む必要があります。それ以外の場合は、データベースに格納されているとおりの大/小文字で入力します。

適切な関数の使用

操作対象または評価対象の列のタイプに適した関数を使用してください。たとえば、数値関数は数値を比較する場合にのみ使用できます。文字列値を比較するには、Oracle GoldenGate文字比較関数のいずれかを使用します。LOB列は、変換関数では使用できません。

次の文は、数値関数の@IFを使用して文字列値を比較しているため、失敗します。

@IF (SR_AREA = 'Help Desk', 'TRUE', 'FALSE')

次の文は、数値を比較しているため、成功します。

@IF (SR_AREA = 20, 'TRUE', 'FALSE')

詳細は、「数値および文字列の操作」を参照してください。

ノート:

引数解析のエラーは、レコードが処理されるまで検出されないことがあります。プロセスを起動する前に構文を確認してください。

日付の変換

@DATE@DATEDIFおよび@DATENOWの各関数を使用して、日時の取得、日時の計算および日時の変換を行います。

次の例では、注文が処理された時間を計算します。

例8-5 時間の計算

ORDER_FILLED = @DATE (
    'YYYY-MM-DD HH:MI:SS',
    'JTS',
    @DATE ('JTS',
    'YYMMDDHHMISS',
    ORDER_TAKEN_TIME) +
    ORDER_MINUTES * 60 * 1000000)

算術演算の実行

算術式の結果を戻すには、@COMPUTE関数を使用します。関数から返される値は、文字列形式です。算術式では、次の要素を組み合せることができます。

  • 数字

  • 数字を含む列名

  • 数字を返すファンクション

  • 算術演算子:

    • + (加算)

    • - (減算)

    • * (乗算)

    • / (除算)

    • \ (余り)

  • 比較演算子:

    • > (より大きい)

    • >= (以上)

    • < (より少ない)

    • <= (以下)

    • = (等しい)

    • <> (等しくない)

    比較から導出した結果はゼロ(FALSEを示す)またはゼロ以外(TRUEを示す)になります。

  • カッコ(式の結果をグループ化)

  • 結合演算子ANDOR。Oracle GoldenGateは、結合式の必要部分のみを評価します。文がFALSEになると、式の残りの部分は無視されます。この動作は、紛失またはNULLの可能性があるフィールドを評価するときに役立ちます。たとえば、COL1の値が25で、COL2の値が10の場合は、次のようになります。

    @COMPUTE ( (COL1 > 0) AND (COL2 < 3) ) returns 0.
    @COMPUTE ( (COL1 < 0) AND (COL2 < 3) ) returns 0. COL2 < 3 is never evaluated.
    @COMPUTE ((COL1 + COL2)/5) returns 7.
    
@COMPUTEの省略

@COMPUTEキーワードは、式を関数の引数として渡す場合には必要ありません。

@STRNUM ((AMOUNT1 + AMOUNT2), LEFT)

次の式は、前述の式と同じ結果を戻します。

@STRNUM ((@COMPUTE (AMOUNT1 + AMOUNT2), LEFT)

数値および文字列の操作

数値および文字列を変換するため、Oracle GoldenGateでは次の関数が提供されています。

表8-7 数値および文字のための変換関数

目的 変換関数

バイナリ文字列または文字列の数値への変換

@NUMBIN

@NUMSTR

数値の文字列への変換

@STRNUM

文字列の比較。

@STRCMP

@STRNCMP

文字列の連結。

@STRCAT

@STRNCAT

文字列からの抽出

@STREXT

@STRFIND

文字列の長さの返却

@STRLEN

ある文字列と別の文字列の置換

@STRSUB

文字列の大文字への変換

@STRUP

先頭または末尾(あるいはその両方)の空白の切捨て

@STRLTRIM

@STRRTRIM

@STRTRIM

NULL値、無効なデータおよび欠落データの処理

列データが欠落しているか、無効であるか、またはNULLである場合、Oracle GoldenGate変換関数では、それぞれに対応する値が戻されます。

BALANCE1000でも、AMOUNTNULLの場合、次の式ではNULLが戻されます。

NEW_BALANCE = @COMPUTE (BALANCE + AMOUNT)

これらの例外条件によって、計算全体が無効になります。変換を確実に成功させるには、@COLSTAT@COLTESTおよび@IFの各関数を使用して、例外条件をテスト(および上書き)してください。

@COLSTATの使用

@COLSTAT関数を使用して、列が欠落しているか、NULLであるか、または無効であることを示すインジケータをExtractまたはReplicatに戻します。このインジケータは、別の変換関数を使用する大規模な操作式の一部として使用できます。

次の例では、ターゲット列のITEMNULLを戻します。

ITEM = @COLSTAT (NULL)

次の@IFの計算では、PRICEおよびQUANTITYが0(ゼロ)未満の場合に、@COLSTATを使用してターゲット列にNULLを戻します。

ORDER_TOTAL = PRICE * QUANTITY, @IF ((PRICE < 0) AND (QUANTITY < 0), @COLSTAT (NULL))
@COLTESTの使用

@COLTEST関数を使用して、次の条件をチェックします。

  • PRESENTは、列が存在してNULLではないかどうかをテストします。

  • NULLは、列が存在してNULLであるかどうかをテストします。

  • MISSINGは、列が存在していないかどうかをテストします。

  • INVALIDは、列が存在して無効なデータを含んでいるかどうかをテストします。

次の例は、AMOUNT列が存在してNULLであるか、およびそれが存在するが無効であるかをチェックします。

@COLTEST (AMOUNT, NULL, INVALID)
@IFの使用

@IF関数では、条件に基づいて2つの値のうち1つを返します。この関数を@COLSTAT関数および@COLTEST関数とともに使用して、1つ以上の例外条件をテストする条件付き引数を開始し、そのテストの結果に基づいて処理を実行します。

NEW_BALANCE = @IF (@COLTEST (BALANCE, NULL, INVALID) OR
@COLTEST (AMOUNT, NULL, INVALID), @COLSTAT (NULL), BALANCE + AMOUNT)

この変換では次のいずれかの値が戻されます。

  • NULL (BALANCEまたはAMOUNTNULLまたはINVALIDの場合)

  • MISSING (いずれかの列が欠落している場合)

  • 列の合計

テストの実行

@CASE、@VALONEOFおよび@EVALの各関数によって、データを操作またはマップする前にテストを実行するための追加の方法が提供されます。

@CASEの使用

@CASEを使用して、一連の値テストに応じて値を選択します。

@CASE (PRODUCT_CODE, 'CAR', 'A car', 'TRUCK', 'A truck')

この例では、次の要素が戻されます。

  • A car (PRODUCT_CODECARの場合)

  • A truck (PRODUCT_CODETRUCKの場合)

  • FIELD_MISSINGインジケータ(PRODUCT_CODEが他のどちらの条件も満たさない場合)

@VALONEOFの使用

@VALONEOFを使用して、列または文字列と値リストを比較します。

@IF (@VALONEOF (STATE, 'CA', 'NY'), 'COAST', 'MIDDLE')

この例では、STATECAまたはNYの場合、値が非ゼロ(つまりTRUE)のときに@IFによって返されるレスポンスである"COAST"が返されます。

@EVALの使用

@EVALを使用して、独立した一連の条件テストに基づいて値を選択します。

@EVAL (AMOUNT > 10000, 'high amount', AMOUNT > 5000, 'somewhat high')

この例では、次の要素が戻されます。

  • high amount (AMOUNT10000を超える場合)

  • somewhat high (前述の条件が満たされなかった場合で、AMOUNT5000を超え、10000以下の場合)

  • FIELD_MISSINGインジケータ(どちらの条件も満たされない場合)

トークンの使用

データを取得して、証跡レコード・ヘッダーのユーザー・トークン領域内に格納できます。トークン・データを取得して、Oracle GoldenGateによる情報の配信方法をカスタマイズするために様々な用途で使用できます。たとえば、トークン・データを次の用途で使用できます。

  • 列マップ

  • SQLEXEC文によってコールされるストアド・プロシージャ

  • ユーザー・イグジット

  • マクロ

トークンの定義

トークンを使用するには、トークン名を定義してデータに関連付けます。データとして使用できるのは、Oracle GoldenGate列変換関数から取得された任意の有効な文字データまたは値です。

レコード・ヘッダーのトークン領域には、最大16,000バイトのデータを格納できます。トークン名、データ長およびデータ自体がこの領域に収まる必要があります。

トークンを定義するには、Extractパラメータ・ファイルのTABLEパラメータのTOKENSオプションを使用します。

構文

TABLE table_spec, TOKENS (token_name = token_data [, ...]);

説明:

  • table_specはソース表の名前です。コンテナまたはカタログの名前(該当する場合)と所有者名を表名の前に付ける必要があります。

  • token_nameは、選択したトークンに付ける名前です。任意の数の英数字を使用できます。大/小文字は区別されません。

  • token_dataは、最大2000バイトの文字列です。データには、一重引用符に囲まれた文字列、またはOracle GoldenGateの列変換関数の結果のいずれかを指定できます。トークン・データの文字セットは変換されません。トークンは、Extract用ソース・データベースの文字セットおよびReplicat用ターゲット・データベースの文字セットである必要があります。証跡ファイルには、ユーザー・トークンはUTF-8で格納されます。

TABLE ora.oratest, TOKENS (
TK-OSUSER = @GETENV ('GGENVIRONMENT' , 'OSUSERNAME'),
TK-GROUP = @GETENV ('GGENVIRONMENT' , 'GROUPNAME')
TK-HOST =  @GETENV('GGENVIRONMENT' , 'HOSTNAME'));

この例に示されているとおり、Oracle GoldenGateの @GETENV関数は、トークン・データを移入するための効果的な方法です。この関数には、トークンにマップしてターゲット・システムで列マッピングに使用できる環境情報を取得するための複数のオプションがあります。

ターゲット表でのトークン・データの使用

ターゲット表にトークン・データをマップするには、ReplicatのMAP文に含まれるCOLMAP句のソース式で@TOKEN列変換関数を使用します。@TOKEN関数によって、マップするトークンの名前を提供します。@TOKENを使用したCOLMAP構文は、次のとおりです。

構文

COLMAP (target_column = @TOKEN ('token_name'))

次のMAP文では、hostgg_groupなどのターゲット列が、tk-hosttk-groupなどのトークンにマップされます。引数は一重引用符で囲む必要があります。

ユーザー・トークン
tk-host
:sysA
tk-group
:extora
tk-osuser
:jad
tk-domain
:admin
tk-ba_ind
:B
tk-commit_ts
:2011-01-24 17:08:59.000000
tk-pos
:3604496
tk-rba
:4058
tk-table
:oratest
tk-optype
:insert

例8-6 MAP文

MAP ora.oratest, TARGET ora.rpt,
COLMAP (USEDEFAULTS,
host = @token ('tk-host'),
gg_group = @token ('tk-group'),
osuser= @token ('tk-osuser'),
domain = @token ('tk-domain'),
ba_ind= @token ('tk-ba_ind'),
commit_ts = @token ('tk-commit_ts'),
pos = @token ('tk-pos'),
rba = @token ('tk-rba'),
tablename = @token ('tk-table'),
optype = @token ('tk-optype'));

この例のトークンは、証跡のレコード・ヘッダー内では次のように示されます。