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つのフィルタが失敗すると、フィルタ全体が失敗します。