パラメータを含むマクロの呼出し
パラメータを含むマクロを呼び出すには、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では、次のルールに従ってマクロ本体のパラメータ値が置換されます。
-
マクロ・プロセッサは、マクロ本体を読み取って、
PARAMS
文に指定されたパラメータ名のインスタンスを検索します。 -
パラメータ名が出現するたびに、呼出し時に指定された対応するパラメータ値が置換されます。
-
パラメータ名が
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)
);