Vereinfachen und automatisieren Sie die Arbeit mit Oracle GoldenGate-Makros

Sie können Oracle GoldenGate-Makros in Parameterdateien verwenden, um Parameter, Befehle und Konvertierungsfunktionen zu konfigurieren und wiederzuverwenden. Reduzieren Sie die Textmenge, die Sie eingeben müssen, um allgemeine Aufgaben auszuführen. Ein Makro ist ein integriertes Automatisierungstool, mit dem Sie eine gespeicherte Gruppe von Verarbeitungsschritten aus der Oracle GoldenGate-Parameterdatei aufrufen können. Ein Makro kann aus einem einfachen Satz häufig verwendeter Parameteranweisungen zu einer komplexen Reihe von Parametersubstitutionen, Berechnungen oder Konvertierungen bestehen. Sie können andere Makros aus einem Makro aufrufen. Sie können häufig verwendete Makros in einer Bibliothek speichern und dann die Bibliothek aufrufen, anstatt die Makros einzeln aufzurufen.

Oracle GoldenGate-Makros funktionieren mit den folgenden Parameterdateien:

Für die Verwendung von Makros gibt es zwei Schritte:

  1. Definieren eines Makros

  2. Ein Makro aufrufen

Definieren eines Makros

Um ein Oracle GoldenGate-Makro zu definieren, verwenden Sie den Parameter MACRO in der Parameterdatei. MACRO definiert alle erforderlichen Eingabeparameter und definiert die Arbeit, die das Makro ausführt.

Syntax

<pre class="copy"><code>MACRO #*macro_name* PARAMS (#*p1*, #*p2* [, ...]) BEGIN *macro_body* END;</code></pre>

Tabelle 18: Makrodefinitionsargumente

Argument Beschreibung
MACRO
Erforderlich. Gibt den Start einer Oracle GoldenGate-Makrodefinition an.
#macro_name

Der Name des Makros. Makro- und Parameternamen müssen mit einem Makrozeichen beginnen. Das Standardmakrozeichen ist das Nummernzeichen (#), wie in #macro1 und #param1.

Ein Makro- oder Parametername kann ein Wort sein, das aus Buchstaben und Zahlen oder beidem besteht. Sonderzeichen wie der Unterstrich (_) oder der Bindestrich (-) können verwendet werden. Beispiele für Makronamen: #mymacro, #macro1, #macro_1, #macro-1, #macro$. Beispiele für Parameternamen sind #sourcecol, #s, #col1 und #col_1.

Um Fehler beim Parsen zu vermeiden, kann das Makrozeichen nicht als erstes Zeichen eines Makronamens verwendet werden. Beispiel: ##macro ist ungültig. Bei Bedarf können Sie das Makrozeichen ändern, indem Sie den Parameter MACROCHAR in der Referenz zu Parametern und Funktionen für Oracle GoldenGate verwenden.

Bei Makro- und Parameternamen wird nicht zwischen Groß- und Kleinschreibung unterschieden. Makro- oder Parameternamen in Anführungszeichen werden ignoriert.

PARAMS (#p1, #p2)
Optionale Definition von Eingabeparametern. Geben Sie eine durch Komma getrennte Liste mit Parameternamen an, und schließen Sie sie in Klammern ein. Jeder Parameter muss im Makrobody referenziert werden, in dem Eingabewerte ersetzt werden sollen. Sie können jeden Parameter in einer separaten Zeile auflisten, um die Lesbarkeit zu verbessern. (Sie müssen die öffnenden und schließenden Klammern verwenden, um die Parameterliste einzuschließen.) Weitere Informationen finden Sie unter Makro aufrufen, das Parameter enthält.
BEGIN
Beginnt den Makrohaupttext. Muss vor dem Makrohaupttext angegeben werden.
macro_body

Der Makrokörper. Der Body ist eine Syntaxanweisung, die definiert, welche Funktion vom Makro ausgeführt werden soll. Ein Makrobody kann eine der folgenden Anweisungstypen enthalten.

  • Einfache Parameteranweisungen, wie in:

    COL1 = COL2
  • Komplexe Parameteranweisungen mit Parametersubstitution wie folgt:

    MAP #o.#t, TARGET #o.#t, KEYCOLS (#k), COLMAP (USEDEFAULTS); 
  • Aufrufe anderer Makros, wie in:

    #colmap (COL1, #sourcecol)
END;
Beendet die Makrodefinition. Das Semikolon ist für den Abschluss der Definition erforderlich.

Im Folgenden finden Sie ein Beispiel für eine Makrodefinition mit Parametern. In diesem Fall vereinfacht das Makro die Aufgabe der Objekt- und Spaltenzuordnung, indem die Basissyntax der MAP-Anweisung mit Eingabeparametern angegeben wird, die in die Namen der Eigentümer, der Tabellen und der KEYCOLS-Spalten aufgelöst werden.

<pre class="copy"><code>MACRO #macro1 PARAMS ( #o, #t, #k ) BEGIN MAP #o.#t, TARGET #o.#t, KEYCOLS (#k), COLMAP (USEDEFAULTS); END;</code></pre>

Im Folgenden finden Sie ein Beispiel für ein Makro, das keine Parameter definiert. Es führt eine häufig verwendete Gruppe von Parametern aus.

MACRO #option_defaults
BEGIN
GETINSERTS
GETUPDATES
GETDELETES
INSERTDELETES
END;

Ein Makro anrufen

Um ein Makro aufzurufen, verwenden Sie die folgende Syntax, in der das Makro in der Parameterdatei ausgeführt werden soll.

Syntax

[*target* =] *macro_name* (*val*[, ...])
[*target* =] *macro_name* (*val* | {*val*, *val*, ...}[, ...])

Tabelle 19 Syntaxelemente zum Aufrufen eines Makros

Argument Beschreibung
Ziel =

Optional. Gibt das Ziel an, dem die Ergebnisse des Makros zugewiesen oder zugeordnet werden. Beispiel: Mit target kann eine Zielspalte in einer COLMAP-Anweisung angegeben werden. Beim folgenden Aufruf des Makros #make_date ist die Spalte DATECOL1 das Ziel und wird den Makroergebnissen zugeordnet.

DATECOL1 = #make_date (YR1, MO1, DAY1)

Ohne Ziel lautet die Syntax für den Aufruf von #make_date:

#make_date (YR1, MO1, DAY1)
macro_name Der Name des Makros, das aufgerufen wird. Beispiel: #make_date.
( Wert[, ...]) Die Parametereingabewerte. Diese Komponente ist erforderlich, unabhängig davon, ob das Makro Parameter definiert. Wenn das Makro Parameter definiert, geben Sie eine durch Komma getrennte Liste der Eingabewerte in der Reihenfolge an, die den Parameterdefinitionen im Parameter MACRO entspricht, und schließen Sie die Liste in Klammern ein. Wenn das Makro keine Parameter definiert, geben Sie die öffnenden und schließenden Klammern mit nichts zwischen ihnen () an.
( val \| {val, val, ...} )[, ...] Die Parametereingabewerte. Diese Komponente ist erforderlich, unabhängig davon, ob das Makro Parameter definiert. Wenn das Makro Parameter definiert, geben Sie eine durch Komma getrennte Liste der Eingabewerte in der Reihenfolge an, die den Parameterdefinitionen im Parameter MACRO entspricht, und schließen Sie die Liste in Klammern ein. Um mehrere Werte an einen Parameter zu übergeben, trennen Sie sie durch Kommas, und schließen Sie die Liste in geschweifte Klammern ein. Wenn das Makro keine Parameter definiert, geben Sie die öffnenden und schließenden Klammern mit nichts zwischen ihnen () an.

Weitere Informationen zur Syntax für den Aufruf eines Makros finden Sie in den folgenden Abschnitten:

Ein Makro aufrufen, das Parameter enthält

Um ein Makro aufzurufen, das Parameter enthält, muss die Aufrufanweisung die Eingabewerte angeben, die bei der Ausführung des Makros durch diese Parameter ersetzt werden sollen.

Gültige Eingabe für einen Makroparameter ist eine der folgenden, dem Makrozeichen vorangestellt (Standard ist #):

Oracle GoldenGate ersetzt Parameterwerte im Makrobody gemäß den folgenden Regeln.

  1. Der Makroprozessor liest den Makrobody durch und sucht nach Instanzen von Parameternamen, die in der PARAMS-Anweisung angegeben sind.

  2. Für jedes Vorkommen des Parameternamens wird der entsprechende Parameterwert ersetzt, der während des Aufrufs angegeben wurde.

  3. Wenn in der PARAMS-Anweisung kein Parametername angezeigt wird, wertet der Makroprozessor aus, ob das Element stattdessen ein Aufruf eines anderen Makros ist. (Siehe Andere Makros von einem Makro aufrufen.) Wenn der Aufruf erfolgreich ist, wird das verschachtelte Makro ausgeführt. Wenn es fehlschlägt, schlägt das gesamte Makro fehl.

Beispiel 9-39: Parameter zum Auffüllen einer MAP-Anweisung verwenden

Die folgende Makrodefinition gibt drei Parameter an, die aufgelöst werden müssen. Die Parameter ersetzen die Namen des Tabelleneigentümers (Parameter #o), der Tabelle (Parameter #t) und der KEYCOLS-Spalten (Parameter #k) in einer MAP-Anweisung.

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

Wenn eine Tabelle in der MAP-Anweisung nur eine KEYCOLS-Spalte erfordert, kann die folgende Syntax zum Aufrufen von #macro1 verwendet werden. In dieser Syntax kann der Parameter #k nur mit einem Wert aufgelöst werden.

#macro1 (SCOTT, DEPT, DEPTNO1)

Um das Makro für eine Tabelle aufzurufen, für die zwei KEYCOLS-Spalten erforderlich sind, werden die geschweiften Klammern wie folgt verwendet, um beide erforderlichen Werte für die Spaltennamen einzuschließen:

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

Die Werte DEPTNO1 und DEPTNO2 werden als ein Argument übergeben, um den Parameter #t aufzulösen. Tabellen mit drei oder mehr KEYCOLS können auch auf diese Weise verarbeitet werden, indem zusätzliche Werte in den geschweiften Klammern verwendet werden.

Beispiel 9-40: Konvertieren mit einem Makro

In diesem Beispiel definiert ein Makro die Parameter #year, #month und #day, um ein proprietäres Datumsformat zu konvertieren.

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;

Das Makro wird in der COLMAP-Klausel aufgerufen:

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

Das Makro wird wie folgt erweitert:

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)
);

Makro ohne Eingabeparameter aufrufen

Um ein Makro ohne Eingabeparameter aufzurufen, muss die Aufrufanweisung öffnende und schließende Klammern angeben, jedoch ohne Eingabewerte: #macro ().

Das folgende Makro wird ohne Eingabeparameter definiert. Der Body enthält häufig verwendete Parameter.

MACRO #option_defaults
BEGIN
GETINSERTS
GETUPDATES
GETDELETES
INSERTDELETES
END;

Dieses Makro wird wie folgt aufgerufen:

#option_defaults ()
IGNOREUPDATES
MAP owner.srctab, TARGET owner.targtab;

#option_defaults ()
MAP owner.srctab2, TARGET owner.targtab2;

Das Makro wird wie folgt erweitert:

GETINSERTS
GETUPDATES
GETDELETES
INSERTDELETES
IGNOREUPDATES
MAP owner.srctab, TARGET owner.targtab;

GETINSERTS
GETUPDATES
GETDELETES
INSERTDELETES
MAP owner.srctab2, TARGET owner.targtab2;

Andere Makros von einem Makro aufrufen

Um andere Makros aus einem Makro aufzurufen, erstellen Sie eine Makrodefinition ähnlich der folgenden. In diesem Beispiel ist das Makro #make_date im Makro #assign_date verschachtelt und wird aufgerufen, wenn #assign_date ausgeführt wird.

Das verschachtelte Makro muss alle oder eine Teilmenge derselben Parameter definieren, die im Basismakro definiert sind. Mit anderen Worten, die Eingabewerte, wenn das Basismakro aufgerufen wird, müssen sich in beiden Makros in die Parameter auflösen.

Im Folgenden wird #assign_date definiert:

MACRO #assign_date
PARAMS (#target_col, #year, #month, #day)
BEGIN
#target_col = #make_date (#year, #month, #day)
END;

Im Folgenden wird #make_date definiert. Dieses Makro erstellt ein Datumsformat, das ein vierstelliges Jahr enthält, nachdem zuerst bestimmt wurde, ob dem zweistelligen Eingabedatum ein Jahrhundertwert von 19 oder 20 vorangestellt werden soll. Beachten Sie, dass die PARAMS-Anweisung von #make_date eine Teilmenge der Parameter im #assign_date-Makro enthält.

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;

Die folgende Syntax ruft #assign_date auf:

#assign_date (COL1, YEAR, MONTH, DAY)

Das Makro wird mit den vorhergehenden Eingabewerten und dem eingebetteten Makro #make_date wie folgt erweitert:

COL1 = @DATE ('YYYY-MM-DD', 'CC', @IF (YEAR < 50, 20, 19),'YY', YEAR, 'MM', MONTH, 'DD', DAY)

Makrobibliotheken erstellen

Sie können eine Makrobibliothek erstellen, die mindestens ein Makro enthält. Durch die Verwendung einer Makrobibliothek können Sie ein Makro einmal definieren und es dann in vielen Parameterdateien verwenden.

So erstellen Sie eine Makrobibliothek

  1. Öffnen sie eine neue datei in einem texteditor.

  2. Verwenden Sie bei Bedarf kommentierte Zeilen, um die Bibliothek zu beschreiben.

  3. Verwenden Sie die folgende Syntax, um jedes Makro zu definieren:

    MACRO #*macro_name*
    PARAMS (#*p1*, #*p2* [, ...])
    BEGIN
    
    *macro_body*
    END;
  4. Speichern Sie die Datei im Unterverzeichnis dirprm des Oracle GoldenGate-Verzeichnisses wie folgt:

    *filename*.mac

    Wo:

    Hierbei ist Dateiname der Name der Datei. Die Erweiterung .mac definiert die Datei als Makrobibliothek.

Die folgende Beispielbibliothek namens datelib enthält zwei Makros: #make_date und #assign_date.

-- 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;

Um eine Makrobibliothek zu verwenden, verwenden Sie den Parameter INCLUDE am Anfang einer Parameterdatei, wie in der folgenden Beispieldatei für Replicat-Parameter dargestellt.

INCLUDE /ggs/dirprm/datelib.mac
REPLICAT rep
ASSUMETARGETDEFS
USERIDALIAS ogg
MAP fin.acct_tab, TARGET fin.account;

Wenn Sie eine lange Makrobibliothek in eine Parameterdatei aufnehmen, können Sie den Parameter NOLIST verwenden, um die Auflistung jedes Makros in der Extract- oder Replicat-Berichtsdatei zu unterdrücken. Die Auflistung kann ein- und ausgeschaltet werden, indem die Parameter LIST und NOLIST an einer beliebigen Stelle in der Parameterdatei oder in der Makro-Library-Datei platziert werden. Im folgenden Beispiel unterdrückt NOLIST die Auflistung jedes Makros in der Makrobibliothek hugelib. Wenn Sie LIST angeben, nachdem die INCLUDE-Anweisung die normale Auflistung in der Berichtsdatei wiederhergestellt hat.

NOLIST
INCLUDE /ggs/dirprm/hugelib.mac
LIST
INCLUDE /ggs/dirprm/mdatelib.mac
REPLICAT REP

Makroerweiterung verfolgen

Sie können die Makroerweiterung mit dem Parameter CMDTRACE verfolgen. Wenn CMDTRACE aktiviert ist, werden Makroerweiterungsschritte in der Extract- oder Replicat-Berichtsdatei angezeigt.

Syntax

CMDTRACE [ON | OFF | DETAIL]

Wo:

Im folgenden Beispiel wird das Tracing aktiviert, bevor #testmac aufgerufen und nach der Ausführung des Makros deaktiviert wird.

<pre class="copy"><code>REPLICAT REP MACRO #testmac BEGIN COL1 = COL2, COL3 = COL4, END; ... CMDTRACE ON MAP test.table1, TARGET test.table2, COLMAP (#testmac); CMDTRACE OFF</code></pre>