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
の構文は次のとおりで、エラー処理オプションがあります。
MAPsource_table
, TARGETtarget_table
, , FILTER ( [, ON INSERT | ON UPDATE| ON DELETE] [, IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE] [, RAISEERRORerror_number
] ,filter_clause
);
FILTER
句の有効な要素は、次のとおりです。
-
Oracle GoldenGate列変換関数。これらの関数は、Oracle GoldenGateに組み込まれており、テストの実行、データの操作、値の取得などを行うことができます。Oracle GoldenGate変換関数の詳細は、「データのテストおよび変換」を参照してください。
-
数値
-
数字を含む列
-
数字を返すファンクション
-
算術演算子:
-
+
(加算) -
-
(減算) -
*
(乗算) -
/
(除算) -
\
(余り)
-
-
比較演算子:
-
>
(より大きい) -
>=
(以上) -
<
(より小さい) -
<=
(以下) -
=
(等しい) -
<>
(等しくない) -
比較から導出した結果はゼロ(
FALSE
を示す)またはゼロ以外(TRUE
を示す)になります。
-
-
カッコ(式の結果をグループ化)
-
結合演算子:
AND
、OR
次のFILTER
オプションを使用して、フィルタ句の影響を受けるSQL操作を指定します。これらのオプションは、任意に結合できます。
ON INSERT | ON UPDATE | ON DELETE
IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE
MAPパラメータのFILTER
のRAISEERROR
オプションを使用して、フィルタに失敗したときのユーザー定義のエラーを生成します。このオプションは、失敗に応じてイベントを起動する必要がある場合に役立ちます。
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, |
|
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 @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つのフィルタが失敗すると、フィルタ全体が失敗します。