パラメータを含むマクロの呼出し

パラメータを含むマクロを呼び出すには、call文で、マクロの実行時にこれらのパラメータを置換する入力値を指定する必要があります。

マクロ・パラメータの有効な入力は、マクロ文字(デフォルトは#)で始まる次のいずれかです。

  • プレーン・テキストまたは引用テキストの単一値(#macro (#name, #address, #phone)#macro (#"name", #"address", #"phone")など)。

  • 中カッコで囲まれたカンマ区切りの値リスト(#macro1 (SCOTT, DEPT, {DEPTNO1, DEPTNO2, DEPTNO3})など)。指定されたパラメータの値のブロックを置換できるようにすると、マクロ定義とOracle GoldenGate構成のユーザビリティの柔軟性が向上します。

  • 他のマクロの呼出し(#macro (#mycalc (col2, 100), #total)など)。この例では、入力値がcol2および100#mycalcマクロが呼び出されます。

Oracle GoldenGateでは、次のルールに従ってマクロ本体のパラメータ値が置換されます。

  1. マクロ・プロセッサは、マクロ本体を読み取って、PARAMS文に指定されたパラメータ名のインスタンスを検索します。

  2. パラメータ名が出現するたびに、呼出し時に指定された対応するパラメータ値が置換されます。

  3. パラメータ名がPARAMS文に出現しない場合、マクロ・プロセッサは、その項目が別のマクロの呼出しになっているかどうかを評価します。(「マクロからの他のマクロの呼出し」を参照)。呼出しが成功した場合、ネストされたマクロが実行されます。失敗した場合、マクロ全体が失敗します。

例11-39 パラメータを使用したMAP文の移入

次のマクロ定義は、解決が必要な3つのパラメータを指定しています。これらのパラメータは、MAP文の表所有者名(パラメータ#o)、表名(パラメータ#t)およびKEYCOLS列名(パラメータ#k)を置換します。

MACRO #macro1  PARAMS ( #o, #t, #k )  BEGIN  MAP #o.#t, TARGET #o.#t, KEYCOLS (#k), COLMAP (USEDEFAULTS); END; 

MAP文の表にKEYCOLS列が1つのみ必要である場合、次の構文を使用して#macro1を呼び出すことができます。この構文では、1つのみの値で#kパラメータを解決できます。

#macro1 (SCOTT, DEPT, DEPTNO1)

2つのKEYCOLS列が必要な表のマクロを呼び出すには、次のように中括弧を使用して、列名に必要な両方の値を囲みます。

#macro1 (SCOTT, DEPT, {DEPTNO1, DEPTNO2})

DEPTNO1値およびDEPTNO2値は、#tパラメータを解決するための1つの引数として渡されます。この方法で、中括弧の内側に追加の値を使用して、3つ以上のKEYCOLSのある表を処理できます。

例11-40 マクロを使用した変換の実行

この例では、マクロで#year#monthおよび#dayの各パラメータを定義して、独自仕様の日付書式を変換します。

MACRO #make_date
PARAMS (#year, #month, #day)
BEGIN
@DATE ('YYYY-MM-DD', 'CC', @IF (#year < 50, 20, 19), 'YY', #year, 'MM', #month, 'DD', #day)
END;

マクロはCOLMAP句で呼び出されます。

MAP sales.acct_tab, TARGET sales.account,
COLMAP
(
targcol1 = sourcecol1,
datecol1 = #make_date(YR1, MO1, DAY1),
datecol2 = #make_date(YR2, MO2, DAY2)
);

マクロは次のように展開されます。

MAP sales.acct_tab, TARGET sales.account,
COLMAP
(
targcol1 = sourcecol1,
datecol1 = @DATE ('YYYY-MM-DD', 'CC', @IF (YR1 < 50, 20, 19),'YY', YR1, 'MM', MO1, 'DD', DAY1),
datecol2 = @DATE ('YYYY-MM-DD', 'CC', @IF (YR2 < 50, 20, 19),'YY', YR2, 'MM', MO2, 'DD', DAY2)
);