Oracle GoldenGateマクロによる作業の簡略化および自動化
パラメータ・ファイルでOracle GoldenGateマクロを使用すると、パラメータ、コマンドおよび変換関数を構成して再利用できるため、一般的なタスクを実行する際に入力する必要のあるテキストの量を減らすことができます。マクロとは、格納されている処理ステップのセットをOracle GoldenGateパラメータ・ファイルから呼び出すことを可能にする組込みの自動化ツールです。マクロには、頻繁に使用するパラメータ文の単純なセットを含めることも、パラメータ置換、計算または変換が連続する複雑な組合せを含めることもできます。1つのマクロから他のマクロを呼び出すことができます。よく使用するマクロをライブラリに格納すると、個別にマクロを呼び出さずにそのライブラリを呼び出すことができます。
Oracle GoldenGateマクロは、次のパラメータ・ファイルと連携して動作します。
-
DEFGEN
-
Extract
-
Replicat
マクロの使用は、次の2つのステップで行います。
マクロの定義
マクロの呼出し
トピック:
マクロの定義
Oracle GoldenGateマクロを定義するには、パラメータ・ファイルでMACRO
パラメータを使用します。MACRO
では、必要な入力パラメータを定義し、マクロにより実行する処理を定義します。
構文
MACRO #macro_name
PARAMS (#p1
, #p2
[, ...])
BEGIN
macro_body
END;
表11-3 マクロ定義の引数
引数 | 説明 |
---|---|
|
必須。Oracle GoldenGateマクロ定義の開始を指定します。 |
|
マクロ名。マクロおよびパラメータ名は、マクロ文字で開始する必要があります。デフォルトのマクロ文字は、番号記号(#)です( マクロまたはパラメータ名は、文字や数字(あるいはその両方)を含む1語にできます。アンダースコア文字( 解析エラーを回避するため、マクロ名の最初の文字としてマクロ文字を使用することはできません。たとえば、 マクロ名とパラメータ名では、大/小文字は区別されません。引用符内のマクロ名またはパラメータ名は、無視されます。 |
PARAMS (# |
入力パラメータのオプション定義。パラメータ名のカンマ区切りリストを指定して、カッコで囲みます。入力値を置換するマクロ本体で、各パラメータを参照する必要があります。各パラメータを個別の行にリストすると読みやすくなります(必ず開きカッコと閉じカッコを使用してパラメータ・リストを囲んでください)。詳細は、「パラメータを含むマクロの呼出し」を参照してください。 |
BEGIN |
マクロ本文を開始します。マクロ本文の前に指定する必要があります。 |
|
マクロ本体。本体は、マクロにより実行される関数を定義する構文の文です。マクロ本体には、次のタイプの文を含めることができます。
|
|
マクロ定義を終了します。定義の末尾にはセミコロンが必要です。 |
パラメータを含むマクロ定義の例を次に示します。この場合、マクロでは、所有者、表およびKEYCOLS
列の名前に解決される入力パラメータを含むMAP
文のベース構文を提供することによって、オブジェクトおよび列のマッピングのタスクを簡略化します。
MACRO #macro1
PARAMS ( #o, #t, #k )
BEGIN
MAP #o.#t, TARGET #o.#t, KEYCOLS (#k), COLMAP (USEDEFAULTS);
END;
パラメータを定義していないマクロの例を次に示します。頻繁に使用するパラメータのセットを実行します。
MACRO #option_defaults
BEGIN
GETINSERTS
GETUPDATES
GETDELETES
INSERTDELETES
END;
マクロの呼出し
マクロを呼び出すには、パラメータ・ファイル内のマクロの実行場所に次の構文を使用します。
構文
[target =] macro_name (val[, ...])
[target =] macro_name (val | {val, val, ...}[, ...])
表11-4 マクロを呼び出すための構文要素
引数 | 説明 |
---|---|
|
オプション。マクロ処理の結果の割当て先またはマップ先のターゲットを指定します。たとえば、
ターゲットがない場合、
|
|
呼び出されるマクロの名前(たとえば: |
|
パラメータ入力値。このコンポーネントは、マクロがパラメータを定義しているかどうかにかかわらず必須です。マクロがパラメータを定義している場合、 |
|
パラメータ入力値。このコンポーネントは、マクロがパラメータを定義しているかどうかにかかわらず必須です。マクロがパラメータを定義している場合、 |
マクロを呼び出す構文の詳細は、次のトピックを参照してください。
パラメータを含むマクロの呼出し
パラメータを含むマクロを呼び出すには、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-6 パラメータを使用した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-7 マクロを使用した変換の実行
この例では、マクロで#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)
);
親トピック: マクロの呼出し
入力パラメータのないマクロの呼出し
入力パラメータのないマクロを呼び出すには、call文で入力値のない開きカッコと閉じカッコ(#macro ()
)を指定します。
次のマクロは、入力パラメータなしで定義されています。本体には頻繁に使用するパラメータが含まれています。
MACRO #option_defaults
BEGIN
GETINSERTS
GETUPDATES
GETDELETES
INSERTDELETES
END;
このマクロは次のように呼び出されます。
#option_defaults ()
IGNOREUPDATES
MAP owner.srctab, TARGET owner.targtab;
#option_defaults ()
MAP owner.srctab2, TARGET owner.targtab2;
マクロは次のように展開されます。
GETINSERTS
GETUPDATES
GETDELETES
INSERTDELETES
IGNOREUPDATES
MAP owner.srctab, TARGET owner.targtab;
GETINSERTS
GETUPDATES
GETDELETES
INSERTDELETES
MAP owner.srctab2, TARGET owner.targtab2;
親トピック: マクロの呼出し
マクロからの他のマクロの呼出し
マクロから他のマクロを呼び出すには、次のようなマクロ定義を作成します。この例では、#make_date
マクロが#assign_date
マクロ内にネストされ、#assign_date
の実行時に呼び出されます。
ネストされたマクロは、ベース・マクロに定義された同じパラメータの全部またはサブセットを定義している必要があります。つまり、ベース・マクロの呼出し時の入力値が両方のマクロのパラメータに解決される必要があります。
次では、#assign_date
を定義しています。
MACRO #assign_date PARAMS (#target_col, #year, #month, #day) BEGIN #target_col = #make_date (#year, #month, #day) END;
次では、#make_date
を定義しています。このマクロでは、2桁の入力日付の前に世紀値(19または20)を付ける必要があるかどうかを最初に判別した後、4桁の年を含む日付書式を作成します。#make_date
のPARAMS
文には、#assign_date
マクロ内のパラメータのサブセットが含まれています。
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;
次の構文は#assign_date
を呼び出します。
#assign_date (COL1, YEAR, MONTH, DAY)
前の入力値および埋込み#make_date
マクロを想定すると、マクロは次のように展開されます。
COL1 = @DATE ('YYYY-MM-DD', 'CC', @IF (YEAR < 50, 20, 19),'YY', YEAR, 'MM', MONTH, 'DD', DAY)
マクロ・ライブラリの作成
1つ以上のマクロを含むマクロ・ライブラリを作成できます。マクロ・ライブラリを使用すると、マクロを1回定義するだけで、そのマクロを多くのパラメータ・ファイルで使用できます。
マクロ・ライブラリを作成する手順
-
テキスト・エディタで新規ファイルを開きます。
-
必要に応じて、コメント行を使用してライブラリを説明します。
-
次の構文を使用して、各マクロを定義します。
MACRO #macro_name PARAMS (#p1, #p2 [, ...]) BEGIN macro_body END;
-
ファイルを次の形式でOracle GoldenGateディレクトリの
dirprm
サブディレクトリに保存します。filename.mac
説明:
filename
は、ファイルの名前です。.mac
拡張子によって、ファイルをマクロ・ライブラリとして定義します。
次のdatelib
というサンプル・ライブラリには、#make_date
および#assign_date
という2つのマクロが含まれます。
-- datelib macro library
--
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;
MACRO #assign_date
PARAMS (#target_col, #year, #month, #day)
BEGIN
#target_col = #make_date (#year, #month, #day)
END;
マクロ・ライブラリを使用するには、パラメータ・ファイルの先頭でINCLUDE
パラメータを使用します。次のサンプルのReplicatパラメータ・ファイルを参照してください。
INCLUDE /ggs/dirprm/datelib.mac
REPLICAT rep
ASSUMETARGETDEFS
USERIDALIAS ogg
MAP fin.acct_tab, TARGET fin.account;
パラメータ・ファイルに長いマクロ・ライブラリが含まれる場合、NOLIST
パラメータを使用して、ExtractまたはReplicatのレポート・ファイルで各マクロがリスト表示されることを抑止できます。リスト表示の有効化と無効化を切り替えるには、パラメータ・ファイル内またはマクロ・ライブラリ・ファイル内の任意の場所にLIST
パラメータおよびNOLIST
パラメータを配置します。次の例では、NOLIST
によって、hugelib
マクロ・ライブラリに含まれる各マクロのリスト表示を抑止します。INCLUDE
文の後にLIST
を指定することで、レポート・ファイルを通常のリスト表示に戻します。
NOLIST
INCLUDE /ggs/dirprm/hugelib.mac
LIST
INCLUDE /ggs/dirprm/mdatelib.mac
REPLICAT REP
マクロ展開のトレース
CMDTRACE
パラメータを使用して、マクロ展開をトレースできます。CMDTRACE
を有効化すると、マクロ展開ステップがExtractまたはReplicatのレポート・ファイルに表示されます。
構文
CMDTRACE [ON | OFF | DETAIL]
説明:
-
ON
は、トレースを有効化します。 -
OFF
は、トレースを無効化します。 -
DETAIL
は、マクロ展開の詳細表示を生成します。
次の例では、トレースが#testmac
の呼出し前に有効化され、マクロの実行後に無効化されます。
REPLICAT REP MACRO #testmac BEGIN COL1 = COL2, COL3 = COL4, END; ... CMDTRACE ON MAP test.table1, TARGET test.table2, COLMAP (#testmac); CMDTRACE OFF