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-3 複数の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-3 @COMPUTE関数のコール

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

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

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

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

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

例8-5 レコードの選択

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

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

例8-6 @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のパラメータ・ファイルの一部を示した**INTERNAL XREF ERROR**に示すように、1つのMAP文またはTABLE文内に複数のFILTER句を結合できます。Oracle GoldenGateでは、フィルタはいずれか1つが失敗するか、すべてが成功するまでリスト順に実行されます。1つのフィルタが失敗すると、フィルタ全体が失敗します。