SQLEXEC
Gültig für
Extrakt und Replicat
Beschreibung
Verwenden Sie den Parameter SQLEXEC, um eine Stored Procedure, Abfrage oder einen Datenbankbefehl im Kontext der Oracle GoldenGate-Verarbeitung auszuführen. Mit SQLEXEC kann Oracle GoldenGate direkt mit der Datenbank kommunizieren, um alle von der Datenbank unterstützten Aufgaben auszuführen. Diese Arbeit kann Teil des Synchronisierungsprozesses sein, z. B. das Abrufen von Werten für die Spaltenkonvertierung, oder sie kann unabhängig vom Extrahieren oder Replizieren von Daten sein, z. B. das Ausführen einer gespeicherten Prozedur, die eine Aktion innerhalb der Datenbank ausführt.
Hinweis: SQLEXEC bietet minimale Globalisierungsunterstützung. Um SQLEXEC in der Capture-Parameterdatei des Source Capture-Prozesses zu verwenden, stellen Sie sicher, dass der Clientzeichensatz in der .prm-Quelldatei entweder identisch oder eine Obermenge des Zeichensatzes der Quelldatenbank ist.
Die SQLEXEC sieht wie folgt aus:
-
Als Standalone-Anweisung auf der Root-Ebene einer Parameterdatei, um eine gespeicherte SQL-Prozedur oder -Abfrage auszuführen oder einen Datenbankbefehl auszuführen. Als Standalone-Anweisung wird
SQLEXECwährend der Oracle GoldenGate-Verarbeitung unabhängig von einerTABLE- oderMAP-Anweisung ausgeführt. Wenn sie in einem Standalone-ParameterSQLEXECverwendet wird, kann eine Abfrage oder Prozedur keine Parameter enthalten. Siehe "StandaloneSQLEXEC". -
Als Teil eines Parameters
TABLEoderMAP, um eine Stored Procedure oder Abfrage mit oder ohne Parameter auszuführen. Bei der Verwendung mit Parametern kann die ausgeführte Prozedur oder Abfrage Eingabeparameter aus Quell- oder Zielzeilen akzeptieren und Ausgabeparameter übergeben. Siehe "SQLEXECin aTABLEorMAPParameter". -
In Remote Capture-Anwendungsfällen kann die Verwendung von
SQLEXECzu zusätzlicher Latenz führen, da der VorgangSQLEXECfür jeden Datensatz, den der Extract verarbeitet, seriell ausgeführt werden muss. Wenn eine spezielle Filterung, die eineSQLEXECerfordern würde, von einem Remotehub-Extrakt ausgeführt wird und die Performanceauswirkungen zu schwerwiegend sind, muss der Extract-Prozess möglicherweise näher an die Quelldatenbank verschoben werden. Achtung: Gehen Sie vorsichtig vor, wenn SieSQLEXEC-Prozeduren für die Datenbank ausführen, insbesondere für die Produktionsdatenbank. Änderungen, die von der Prozedur festgeschrieben werden, können dazu führen, dass vorhandene Daten überschrieben werden.
Hinweis: Der Parameter SQLEXECONBEFOREIMAGE unterstützt die Ausführung von SQLEXEC für Before Image-Datensätze.
Hinweis: Der Parameter SQLEXECONBEFOREIMAGE wird im PK-Update- oder Unified Update-Datensatz ignoriert, wenn der Typ EXEC TRANSACTION, SOURCEROW oder ONCE ist.
Eigenständige SQLEXEC
Ein Standalone-Parameter SQLEXEC ist ein Parameter, der auf Root-Ebene einer Parameterdatei verwendet wird und unabhängig von einem Parameter TABLE oder MAP agiert. Im Folgenden finden Sie Richtlinien für die Verwendung eines Standalone-Parameters SQLEXEC.
-
Eine eigenständige
SQLEXEC-Anweisung wird in der Reihenfolge ausgeführt, in der sie in der Parameterdatei relativ zu anderen Parametern angezeigt wird. -
Eine
SQLEXEC-Prozedur oder -Abfrage muss die gesamte Exception-Behandlung enthalten. -
Eine Abfrage oder Prozedur muss korrekt strukturiert sein, wenn eine
SQLEXEC-Anweisung mit zulässiger SQL-Syntax für die Datenbank ausgeführt wird. Andernfalls wird Replicat unabhängig von vorhandenen Fehlerbehandlungsregeln abgebrochen. Die zulässige SQL-Syntax finden Sie im SQL-Referenzhandbuch des Datenbankherstellers. -
Eine Datenbankzugangsdaten für den Oracle GoldenGate-Benutzer müssen vor der
SQLEXEC-Klausel stehen. Verwenden Sie für Extract die ParameterUSERIDALIASentsprechend für die Datenbank. Verwenden Sie für Replicat gegebenenfalls die ParameterUSERIDALIAS. -
Die Datenbankzugangsdaten, die der Oracle GoldenGate-Prozess verwendet, entsprechen denen, die den SQL-Code ausführen. Diese Zugangsdaten müssen über die Berechtigung verfügen, Befehle und Stored Procedures auszuführen und von der Datenbank bereitgestellte Prozeduren aufzurufen.
-
Eine eigenständige
SQLEXEC-Anweisung kann nicht verwendet werden, um Eingabeparameter aus Datensätzen abzurufen oder Ausgabeparameter zu übergeben. Sie können Stored Procedures und Abfragen mit Parametern verwenden, indem Sie eineSQLEXEC-Anweisung in einerTABLE- oderMAP-Anweisung verwenden. Siehe "SQLEXECin aTABLEorMAPParameter". -
Alle Objekte, die von einer Standalone-Anweisung
SQLEXECbetroffen sind, müssen vorhanden sein, bevor die Oracle GoldenGate-Prozesse gestartet werden. Aus diesem Grund muss dieDDL-Unterstützung für diese Objekte deaktiviert werden. Andernfalls könntenDDL-Vorgänge die Struktur eines Objekts ändern oder löschen, bevor dieSQLEXEC-Prozedur oder -Abfrage darauf ausgeführt wird. -
Objektnamen müssen in ihrem zweiteiligen oder dreiteiligen Namensformat vollqualifiziert sein.
-
Bei Db2 auf z/OS verwendet Oracle GoldenGate die ODBC-Funktion
SQLExecDirect, um eine SQL-Anweisung dynamisch auszuführen. ODBC bereitet die SQL-Anweisung jedes Mal vor, wenn sie in einem bestimmten Intervall ausgeführt wird. Um diese Funktion zu unterstützen, muss der verbundene Datenbankserver so konfiguriert sein, dass SQL dynamisch vorbereitet wird. Weitere Informationen finden Sie in der Dokumentation zu z/OS unter Db2.
Weitere Informationen zur Verwendung von Standalone SQLEXEC
Weitere Informationen zur Verwendung von SQLEXEC finden Sie unter Befehle, Stored Procedures und Abfragen mit SQLEXEC ausführen.
Syntax für Standalone SQLEXEC
SQLEXEC
{'call <procedure_name>()' | '<SQL_query>' | '<database_command>'}
[EVERY <n> {SECONDS | MINUTES | HOURS | DAYS}]
[ONEXIT]
[, THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])]
'aufrufen <procedure_name ()'>
Gibt den Namen einer auszuführenden Stored Procedure an. Schließen Sie die Anweisung in einfache Anführungszeichen ein. Das Schlüsselwort call ist erforderlich. Im Folgenden finden Sie ein Beispiel für die Ausführung einer Prozedur mit Standalone-SQLEXEC:
SQLEXEC 'call prc_job_count ()'
<'SQL_query'>
Gibt den Namen einer auszuführenden Abfrage an. Schließen Sie die Abfrage in einfache Anführungszeichen ein. Geben Sie Objektnamen mit Beachtung der Groß-/Kleinschreibung in dem Format an, das für die Datenbank erforderlich ist. Im Folgenden finden Sie ein Beispiel für die Ausführung einer Abfrage mit Standalone-SQLEXEC:
SQLEXEC ' select x from dual '
Verwenden Sie für eine mehrzeilige Abfrage die einfachen Anführungszeichen in jeder Zeile. Um optimale Ergebnisse zu erzielen, geben Sie nach jedem Anfangsanführungszeichen und vor jedem Endanführungszeichen (oder mindestens vor jedem Endanführungszeichen) ein Leerzeichen ein.
<'database_command'>
Führt einen Datenbankbefehl aus. Im Folgenden finden Sie ein Beispiel für die Ausführung eines Datenbankbefehls mit Standalone SQLEXEC:
SQLEXEC 'SET TRIGGERS OFF'
EVERY <n> {SECONDS | MINUTES | HOURS | DAYS}
Führt dazu, dass eine gespeicherte Standalone-Prozedur oder -Abfrage in einem definierten Intervall ausgeführt wird. Beispiel:
SQLEXEC 'call prc_job_count ()' EVERY 30 SECONDS
Das Intervall muss eine ganze positive Ganzzahl sein.
ONEXIT
Führt die SQL-Anweisung aus, wenn der Extract- oder Replicat-Prozess ordnungsgemäß gestoppt wird. Beispiel:
SQLEXEC 'call prc_job_count ()' ONEXIT
THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])
Führt SQLEXEC nur für den bzw. die angegebenen Threads eines koordinierten Replicats aus.
<threadID>[, <threadID>][, ...]
Gibt eine Thread-ID oder eine kommagetrennte Liste mit Threads im Format threadID, threadID, threadID an.
[, <thread_range>[, <thread_range>][, ...]
Gibt einen Threadbereich in Form von threadIDlow-threadIDhigh oder einer durch Komma getrennten Liste von Bereichen im Format von threadIDlow-threadIDhigh, threadIDlow-threadIDhigh an.
Eine Kombination aus diesen Formaten ist ebenfalls zulässig, wie threadID, threadID, threadIDlow-threadIDhigh.
Wenn keine THREADS-Klausel verwendet wird, wird die SQL von allen Threads ausgeführt, die mit dem Befehl ADD REPLICAT für diese Replicat-Gruppe konfiguriert wurden. Wenn die SQL jedoch die Kriterien für eine Sperrentransaktion erfüllt, wird die gesamte SQLEXEC-Anweisung unabhängig von der tatsächlichen Threadzuordnung von Thread 0 verarbeitet.
SQLEXEC in einem TABLE- oder MAP-Parameter
Mit einem Parameter SQLEXEC in einem Parameter TABLE oder MAP kann eine Stored Procedure oder Abfrage ausgeführt werden, die Parameter akzeptiert oder nicht akzeptiert. Im Folgenden werden SQLEXEC-Abhängigkeiten und -Einschränkungen aufgeführt, wenn sie in einer MAP- oder TABLE-Anweisung verwendet werden:
-
Die SQL wird vom Datenbankbenutzer ausgeführt, unter dem der Oracle GoldenGate-Prozess ausgeführt wird. Dieser Benutzer muss über die Berechtigung verfügen, Stored Procedures auszuführen und von der Datenbank bereitgestellte Prozeduren aufzurufen.
-
Eine Abfrage oder Prozedur muss korrekt strukturiert sein, wenn eine
SQLEXEC-Anweisung ausgeführt wird. Wenn Replicat auf ein Problem mit der Abfrage oder Prozedur stößt, wird der Prozess trotz vorhandener Fehlerbehebungsregeln sofort abgebrochen. Die zulässige SQL-Syntax finden Sie im SQL-Referenzhandbuch des Datenbankherstellers. -
Der
COMMIT-Vorgang einer Replicat-Transaktion in der Zieldatenbank schreibt auch alleDML-Änderungen fest, die in einerSQLEXEC-Anweisung innerhalb der Grenze der ursprünglichen Quelltransaktion vorgenommen werden. Dies gilt nicht für Extract, da Extract keine SQL-Transaktionen ausführt. Wenn SieSQLEXECfür Extract verwenden, können Sie implizite Commits aktivieren oder einen expliziten Commit in der ProzedurSQLEXECausführen. -
Geben Sie Literale in einfachen Anführungszeichen an. Geben Sie Objektnamen an, bei denen die Groß-/Kleinschreibung beachtet wird, genauso wie sie in der Datenbank angegeben werden.
-
Verwenden Sie
SQLEXECnicht, um den Wert einer Primärschlüsselspalte zu ändern. Der Primärschlüsselwert wird von Extract an Replicat übergeben. Ohne sie können Replicat-Vorgänge nicht abgeschlossen werden. Wenn Primärschlüsselwerte mitSQLEXECgeändert werden müssen, können Sie Fehler vermeiden, indem Sie den ursprünglichen Schlüsselwert einer anderen Spalte zuordnen und diese Spalte dann als Ersatzschlüssel mit der OptionKEYCOLSder ParameterTABLEundMAPdefinieren. -
Bei Db2 auf z/OS verwendet Oracle GoldenGate die ODBC-Funktion
SQLExecDirect, um eine SQL-Anweisung dynamisch auszuführen. ODBC bereitet die SQL-Anweisung jedes Mal vor, wenn sie in einem bestimmten Intervall ausgeführt wird. Um diese Funktion zu unterstützen, muss der verbundene Datenbankserver so konfiguriert sein, dass SQL dynamisch vorbereitet wird. Weitere Informationen finden Sie in der Dokumentation zu z/OS unter Db2. -
Wenn Sie
DDLmit Oracle GoldenGate replizieren, müssen alle Objekte, die von einer gespeicherten Prozedur oder Abfrage betroffen sind, vor der Ausführung der SQL mit den richtigen Strukturen vorhanden sein. Daher mussDDLfür diese Objekte, die sich auf die Struktur auswirken (wieCREATEoderALTER), vor der Ausführung vonSQLEXECausgeführt werden. -
Alle Objektnamen in einer
SQLEXEC-Anweisung müssen, je nach Datenbank, vollständig mit ihren zweiteiligen oder dreiteiligen Namen versehen sein. -
Verwenden Sie
SQLEXECnicht für Tabellen, die im Passthrough-Modus von einer Data Pump-Extraktgruppe verarbeitet werden. -
Die folgenden Datentypen werden von
SQLEXECfür Eingabe- und Ausgabeparameter unterstützt.-
Numerische Datentypen
-
Datumsdatentypen
-
Zeichendatentypen
-
-
Wenn
SQLEXECvon einem koordinierten Replicat ausgeführt wird, wird es von dem oder den Threads ausgeführt, die mit der OptionTHREADoderTHREADRANGEderMAP-Anweisung angegeben sind. WennSQLEXECjedoch in einemMAP-Parameter angegeben ist, der das SchlüsselwortCOORDINATEDenthält, wird es automatisch als Sperrtransaktion vom Thread mit der niedrigstenID-Nummer ausgeführt, unabhängig von der tatsächlichen Threadzuordnung.
Syntax für SQLEXEC in TABLE oder MAP
SQLEXEC (
{SPNAME <procedure_name>[, ID <logical_name>] |
ID <logical_name>, QUERY ' <SQL_query> '}
{, PARAMS [OPTIONAL | REQUIRED] <parameter_name> = {<source_column> | <OGG_function>} |
NOPARAMS}
[, AFTERFILTER | BEFOREFILTER]
[, ALLPARAMS {OPTIONAL | REQUIRED}]
[, ERROR {IGNORE | REPORT | RAISE | FINAL | FATAL}]
[, EXEC {MAP | ONCE | TRANSACTION | SOURCEROW}][, MAXVARCHARLEN <bytes>]
[, PARAMBUFSIZE <bytes>]
[, TRACE]
[, ...]
[, BEFORE_col1 = @BEFORE(col1),
)
SPNAME <procedure_name>[, ID <logical_name>]
Führt eine Stored Procedure aus.
SPNAME <procedure_name>
Gibt den Namen der auszuführenden Prozedur an.
Das folgende Beispiel zeigt eine einzelne Ausführung einer Stored Procedure namens lookup. In diesem Fall wird der tatsächliche Name der Prozedur verwendet. Ein logischer Name ist nicht erforderlich.
SQLEXEC (SPNAME lookup), PARAMS (param1 = srccol)), &
COLMAP (targcol = lookup.param1);
ID <logical_name>
Definiert einen optionalen logischen Namen für die Prozedur. Beispiel: Logische Namen für eine Prozedur namens lookup können lookup1, lookup2 usw. sein. Verwenden Sie diese Option, um die Prozedur mehrmals innerhalb einer MAP-Anweisung auszuführen. Eine Prozedur kann bis zu 20 Mal pro MAP-Anweisung ausgeführt werden. ID ist nicht erforderlich, wenn Sie eine Prozedur einmal ausführen.
Das folgende Beispiel zeigt die Verwendung der Option ID, um mehrere Ausführungen einer gespeicherten Prozedur zu aktivieren, die Werte aus einer Lookup-Tabelle abruft. Die Werte werden Zielspalten zugeordnet.
SQLEXEC (SPNAME lookup, ID lookup1, &
PARAMS (long_name = current_residence_state)), &
SQLEXEC (SPNAME lookup, ID lookup2, &
PARAMS (long_name = birth_state)), &
COLMAP (custid = custid, current_residence_state_long = lookup
1.long_name, & birth_state_long = lookup2.long_name);
`ID
Führt eine Abfrage aus.
ID <logical_name>
Definiert einen logischen Namen für die Abfrage. Um Werte aus den Abfrageergebnissen zu extrahieren, ist ein logischer Name erforderlich. <ID logical_name> referenziert die von der Abfrage zurückgegebenen Spaltenwerte.
QUERY '<SQL_query>'
Gibt die SQL-Abfragesyntax an, die für die Datenbank ausgeführt werden soll. Die Abfrage kann entweder Ergebnisse mit einer SELECT-Anweisung zurückgeben oder eine INSERT-, UPDATE- oder DELETE-Anweisung ausführen. Eine SELECT-Anweisung darf nur eine Zeile zurückgeben. Werden mehrere Datensätze zurückgegeben, wird nur der erste Datensatz verarbeitet. Geben Sie keine INTO ...-Klausel für eine SELECT statements.The-Abfrage an. Diese muss eine gültige Standardabfragesprache für die Datenbank sein, für die sie ausgeführt wird. Für die meisten Abfragen sind Platzhalter für Eingabeparameter erforderlich. Wie Parameter in der Abfrage angegeben werden, hängt wie folgt vom Datenbanktyp ab:
- Bei Oracle werden Eingabeparameter wie im folgenden Beispiel mit einem Doppelpunkt (:) gefolgt vom Parameternamen angegeben.
'SELECT NAME FROM ACCOUNT WHERE SSN = :SSN AND ACCOUNT = :ACCT'
- Bei anderen Datenbanken werden Eingabeparameter wie im folgenden Beispiel mit einem Fragezeichen angegeben.
'SELECT NAME FROM ACCOUNT WHERE SSN = ? AND ACCOUNT = ?'
Die Abfrage muss in einer Zeile in einfachen Anführungszeichen enthalten sein. Für einen Parameternamen für eine Datenbank sind keine Anführungszeichen erforderlich.
Die folgenden Beispiele veranschaulichen die Verwendung einer SQLEXEC-Abfrage für Oracle- und SQL Server-Abfragen.
Oracle-Beispiel:
MAP sales.account, TARGET sales.newacct, &
SQLEXEC (ID lookup, &
QUERY 'select desc_col into desc_param from lookup_table &
where code_col = :code_param', &
PARAMS (code_param = account_code)), &
COLMAP (newacct_id = account_id, newacct_val = lookup.desc_param);
SQL Server-Beispiel:
MAP sales.account, TARGET sales.newacct, &
SQLEXEC (ID lookup, &
QUERY 'select desc_col into desc_param from lookup_table &
where code_col = ?', &
PARAMS (p1 = account_code)), &
COLMAP (newacct_id = account_id, &
newacct_val = lookup.desc_param);
PARAMS [OPTIONAL | REQUIRED] <parameter_name> = {<source_column> | <OGG_function>} | NOPARAMS
Definiert, ob die Prozedur oder Abfrage Parameter akzeptiert oder nicht, und ordnet die Parameter, falls ja, der Eingabequelle zu. Sie müssen entweder eine PARAMS-Klausel oder NOPARAMS verwenden.
OPTIONAL |
REQUIRED |
Legt fest, ob die Prozedur oder Abfrage ausgeführt wird, wenn Parameterwerte fehlen.
OPTIONAL gibt an, dass kein Parameterwert für die Ausführung von SQL erforderlich ist. Wenn eine erforderliche Quellspalte im Datenbankvorgang fehlt oder eine Spaltenkonvertierungsfunktion nicht erfolgreich abgeschlossen werden kann, weil eine Quellspalte fehlt, wird die SQL-Anweisung trotzdem ausgeführt. OPTIONAL ist der Standard für alle Datenbanken mit Ausnahme von Oracle. Bei Oracle wird beim Abrufen der Stored Procedure-Definition automatisch ermittelt, ob ein Parameter optional ist.
REQUIRED gibt an, dass ein Parameterwert vorhanden sein muss. Wenn der Parameterwert nicht vorhanden ist, wird die SQL nicht ausgeführt.
<parameter_name> = {<source_column> | <OGG_function>}
Ordnet den Namen eines Parameters einer Spalte oder Funktion zu, die den Input liefert. Die folgenden Datentypen werden von SQLEXEC für Eingabe- und Ausgabeparameter unterstützt.
-
Numerische Datentypen
-
Datumsdatentypen
-
Zeichendatentypen
<parameter_name> ist einer der Folgenden:
-
Bei einer Stored Procedure ist es der Name eines beliebigen Parameters in der Prozedur, der die Eingabe akzeptieren kann.
-
Bei einer Oracle-Abfrage ist dies der Name eines beliebigen Eingabeparameters in der Abfrage ohne den führenden Doppelpunkt. Beispiel:
:vemplidwürde in derPARAMS-Klausel alsvemplidangegeben. Oracle lässt die Benennung eines Eingabeparameters bei jedem logischen Namen zu.
SQLEXEC (ID appphone, QUERY ' select per_type from ps_personal_data '
' where emplid = :vemplid '
' and per_status = 'N' and per_type = 'A' ',
PARAMS (vemplid = emplid)),
TOKENS (applid = @GETVAL(appphone.per_type));
- Bei einer Nicht-Oracle-Abfrage ist es
P <n>, wobei<n>die Nummer des Parameters in der Anweisung ist, beginnend mit 1. Beispiel: Bei einer Abfrage mit zwei Parametern lauten die<parameter_name>-Einträgep1 and p2. Überlegen Sie, ob für die Datenbankpin Groß- oder Kleinschreibung verwendet werden muss.
SQLEXEC (ID appphone, QUERY ' select per_type from ps_personal_data '
' where emplid = ? '
' and per_status = 'N' and per_type = 'A' ',
PARAMS (p1 = emplid)),
TOKENS (applid = @GETVAL(appphone.per_type));
<source_column> ist der Name einer Quellspalte, die die Eingabe bereitstellt. Wenn die angegebene Spalte nicht im Log vorhanden ist (da der Datensatz nur die Werte von Spalten enthält, die aktualisiert wurden), geht der Parameter standardmäßig von einem Standardwert aus, der von der Prozedur oder Abfrage für den Parameter angegeben wird.
<OGG_function> ist der Name einer Oracle GoldenGate-Spaltenkonvertierungsfunktion, die zur Angabe der Eingabe ausgeführt wird. Siehe "Funktionen für die Tabellen- und Spaltenzuordnung.
Um Ausgabewerte aus der gespeicherten Prozedur oder Abfrage als Eingabe an eine FILTER- oder COLMAP-Klausel zu übergeben, verwenden Sie die folgende Syntax:
{<procedure_name> | <logical_name>}.<parameter>
Wo:
-
<procedure_name>ist der tatsächliche Name einer Stored Procedure, die mit dem fürSPNAMEin derSQLEXEC-Anweisung angegebenen Wert übereinstimmen muss. Verwenden Sie dieses Argument nur, wenn Sie eine Prozedur während der Oracle GoldenGate-Ausführung einmal ausführen. -
<logical_name>ist der logische Name, der mit der OptionIDvonSQLEXECangegeben wird. Verwenden Sie dieses Argument, um Eingabewerte aus einer Abfrage oder einer Instanz einer Stored Procedure zu übergeben, wenn die Prozedur mehrmals innerhalb einerMAP-Anweisung ausgeführt wird. -
<parameter>ist der Name eines Parameters oderRETURN_VALUE, wenn zurückgegebene Werte extrahiert werden. Standardmäßig werden die Ausgabewerte mit 255 Byte pro Parameter abgeschnitten. Wenn Ausgabeparameter länger sein müssen, verwenden Sie die OptionMAXVARCHARLEN. Hinweis: Alternativ zur vorherigen Syntax können Sie die Funktion@GETVALverwenden.
Die folgenden Beispiele gelten für eine Gruppe von Quell- und Zieltabellen von Oracle und eine Lookup-Tabelle. Diese Beispiele zeigen, wie Parameter für die Tabellen für eine einzelne Instanz einer Stored Procedure und mehrere Instanzen einer Stored Procedure übergeben werden.
Quelltabelle Kunde:
custid Number
current_residence_state Char(2)
birth_state Char(2)
Zieltabelle cust_extended:
custid Number
current_residence_state_long Varchar(30)
birth_state_long Varchar(30)
Lookup-Tabelle state_lookup
abbreviation Char(2)
long_name Varchar(30)
Das folgende Beispiel zeigt die Verwendung einer Stored Procedure, die einmal ausgeführt wird, um einen Wert aus der Lookup-Tabelle abzurufen. Wenn Datensätze aus der Tabelle cust verarbeitet werden, führt Oracle GoldenGate die gespeicherte Prozedur lookup aus, bevor die Spaltenzuordnung ausgeführt wird. Der Parameter long_name in der Prozedur akzeptiert Eingaben aus dem column.The-Wert der birth_state-Quelle. Er wird der Zielspalte birth_state_long in der COLMAP-Anweisung zugeordnet.
MAP sales.cust, TARGET sales.cust_extended, &
SQLEXEC (SPNAME lookup, &
PARAMS (long_name = birth_state)), &
COLMAP (custid = custid, &
birth_state_long = lookup.long_name);
Das folgende Beispiel zeigt die Verwendung der Option ID, um mehrere Ausführungen einer gespeicherten Prozedur zu aktivieren, die Werte aus einer Lookup-Tabelle abruft. Die Werte werden Zielspalten zugeordnet.
MAP sales.cust, TARGET sales.cust_extended, &
SQLEXEC (SPNAME lookup, ID lookup1, &
PARAMS (long_name = current_residence_state)), &
SQLEXEC (SPNAME lookup, ID lookup2, &
PARAMS (long_name = birth_state)), &
COLMAP (custid = custid, current_residence_state_long = lookup1.long_name, & birth_state_long = lookup2.long_name);
AFTERFILTER |
BEFOREFILTER |
Geben Sie mit AFTERFILTER und BEFOREFILTER an, wann die Stored Procedure oder Abfrage in Bezug auf die FILTER-Klausel einer MAP-Anweisung ausgeführt werden soll.
AFTERFILTER
Führt dazu, dass die SQL nach der FILTER-Anweisung ausgeführt wird. Auf diese Weise können Sie den Overhead der SQL-Ausführung überspringen, es sei denn, der Filter ist erfolgreich. Dies ist die standardmäßige Einstellung.
BEFOREFILTER
Führt dazu, dass die SQL vor der FILTER-Anweisung ausgeführt wird, damit die Ergebnisse im Filter verwendet werden können.
Im folgenden Beispiel wird BEFOREFILTER verwendet.
SQLEXEC (SPNAME check, NOPARAMS, BEFOREFILTER)
ALLPARAMS [OPTIONAL |
REQUIRED] |
Verwenden Sie ALLPARAMS als globale Regel, die bestimmt, ob alle angegebenen Parameter vorhanden sein müssen, damit die Stored Procedure oder Abfrage ausgeführt werden kann. Regeln für einzelne Parameter, die innerhalb der PARAMS-Klausel eingerichtet wurden, überschreiben die globale Regelliste mit ALLPARAMS.
OPTIONAL
Ermöglicht dem SQL die Ausführung, ob alle Parameter vorhanden sind oder nicht. Dies ist die standardmäßige Einstellung.
REQUIRED
Erfordert, dass alle Parameter vorhanden sind, damit SQL ausgeführt werden kann.
Im folgenden Beispiel wird OPTIONAL verwendet.
SQLEXEC (SPNAME lookup,
PARAMS (long_name = birth_state, short_name = state),
ALLPARAMS OPTIONAL)
ERROR {IGNORE |
REPORT |
RAISE |
FINAL |
FATAL} |
Verwenden Sie ERROR, um eine Antwort auf Fehler zu definieren, die mit der gespeicherten Prozedur oder Abfrage verknüpft sind. Ohne explizite Fehlerbehandlung beendet der Oracle GoldenGate-Prozess Fehler. Stellen Sie sicher, dass Ihre Prozeduren Fehler an den Prozess zurückgeben, und geben Sie die Antworten mit ERROR an.
Mit Oracle GoldenGate 21c können Sie mit der Funktion verschiedene Verhaltensweisen basierend auf dem Typ "SQL-Fehler" angeben.
Das folgende Beispiel zeigt einen Abbruch-ER-Prozess, wenn der SQL-Fehlercode 1403 oder 1405 bei der Ausführung der Suche nach gespeicherten Prozeduren ermittelt wird. Alle anderen Fehler werden gemeldet, und die Replikation wird fortgesetzt.
SQLEXEC ( SPNAME lookup,
PARAMS( long_name = birth_state, short_name = state),
ERROR REPORT, ERROR FATAL (1403, 1405) );
IGNORE
Führt dazu, dass Oracle GoldenGate alle Fehler ignoriert, die mit der gespeicherten Prozedur oder Abfrage verknüpft sind, und die Verarbeitung fortsetzt. Jede resultierende Parameterextraktion führt zu "Spalte fehlt"-Bedingungen. Dies ist die standardmäßige Einstellung.
REPORT
Stellt sicher, dass alle mit der gespeicherten Prozedur oder Abfrage verknüpften Fehler der Discard-Datei gemeldet werden. Der Bericht ist nützlich, um die Fehlerursache zu verfolgen. Sie enthält sowohl eine Fehlerbeschreibung als auch den Wert der Parameter, die an und von der Prozedur oder Abfrage übergeben werden. Oracle GoldenGate setzt die Verarbeitung fort, nachdem der Fehler gemeldet wurde.
RAISE
Behandelt Fehler gemäß Regeln, die von einem Parameter REPERROR festgelegt wurden. Oracle GoldenGate verarbeitet weitere Stored Procedures oder Abfragen, die mit der aktuellen MAP-Anweisung verknüpft sind, bevor der Fehler verarbeitet wird.
FINAL
ähnelt RAISE. Wenn jedoch ein mit einer Prozedur oder Abfrage verknüpfter Fehler auftritt, werden die verbleibenden gespeicherten Prozeduren und Abfragen umgangen. Fehlerverarbeitung wird unmittelbar nach dem Fehler aufgerufen.
FATAL
Führt dazu, dass Oracle GoldenGate sofort abgebrochen wird, wenn ein Fehler im Zusammenhang mit einer Prozedur oder Abfrage auftritt.
EXEC {MAP |
ONCE |
TRANSACTION |
SOURCEROW} |
Mit EXEC steuern Sie die Häufigkeit, mit der eine Stored Procedure oder Abfrage in einer MAP-Anweisung ausgeführt wird und wie lange die Ergebnisse als gültig betrachtet werden, wenn Ausgabeparameter extrahiert werden.
MAP
Führt die Prozedur oder Abfrage einmal für jede Quell-Ziel-Tabellenzuordnung aus, für die sie angegeben ist. Wenn Sie MAP verwenden, werden die Ergebnisse für alle nachfolgenden Zuordnungen ungültig, die dieselbe Quelltabelle aufweisen. MAP ist die Standardeinstellung.
Das folgende Beispiel zeigt, dass der Standardwert von MAP nicht korrekt verwendet wird. Da MAP der Standardwert ist, muss er nicht explizit in der SQLEXEC-Anweisung aufgeführt werden. In diesem Beispiel wird eine Quelltabelle in separaten MAP-Parametern zwei verschiedenen Zieltabellen zugeordnet. In diesem Fall sind die Ergebnisse nur für das erste Mapping gültig. Die Ergebnisse der Prozedur lookup sind bis zum Zeitpunkt der Ausführung des zweiten MAP-Parameters abgelaufen, und die zweite MAP führt zu einer Bedingung "Spalte fehlt". Um dies korrekt zu implementieren, damit jede MAP gültige Ergebnisse zurückgibt, muss SOURCEROW verwendet werden.
MAP sales.srctab, TARGET sales.targtab, &
SQLEXEC (SPNAME lookup, PARAMS (param1 = srccol)), &
COLMAP (targcol = lookup.param2);
MAP sales.srctab, TARGET sales.targtab2, &
COLMAP (targcol2 = lookup.param2);
ONCE
Führt die Prozedur oder Abfrage einmal während der Oracle GoldenGate-Ausführung beim ersten Aufruf der zugehörigen MAP-Anweisung aus. Die Ergebnisse bleiben so lange gültig, wie der Prozess ausgeführt wird.
Im Folgenden finden Sie ein Beispiel zur Verwendung von ONCE.
MAP sales.cust, TARGET sales.cust_extended, &
SQLEXEC (SPNAME lookup, PARAMS (long_name = birth_state), EXEC ONCE), &
COLMAP (custid = custid, &
birth_state_long = lookup.long_name);
TRANSACTION
Führt die Prozedur oder Abfrage einmal pro Quelltransaktion aus. Die Ergebnisse bleiben für alle Vorgänge der Transaktion gültig.
Im Folgenden finden Sie ein Beispiel zur Verwendung von TRANSACTION.
MAP sales.cust, TARGET sales.cust_extended, &
SQLEXEC (SPNAME lookup, PARAMS (long_name = birth_state), EXEC TRANSACTION), &
COLMAP (custid = custid, &
birth_state_long = lookup.long_name);
SOURCEROW
Führt die Prozedur oder Abfrage einmal pro Quellzeilenvorgang aus. Verwenden Sie diese Option, wenn Sie eine Quelltabelle mit mehreren Zieltabellen synchronisieren, sodass die Ergebnisse der Prozedur oder Abfrage für jedes Quell-Ziel-Mapping aufgerufen werden.
Im Folgenden finden Sie ein Beispiel zur Verwendung von SOURCEROW. In diesem Fall gibt die zweite Zuordnung einen gültigen Wert zurück, da die Prozedur bei jedem Quellzeilenvorgang ausgeführt wird.
MAP sales.srctab, TARGET sales.targtab, &
SQLEXEC (SPNAME lookup, PARAMS (param1 = srccol), EXEC SOURCEROW), &
COLMAP (targcol = lookup.param2);
MAP sales.srctab, TARGET sales.targtab2, &
COLMAP (targcol2 = lookup.param2);
MAXVARCHARLEN <bytes>
Geben Sie mit MAXVARCHARLEN die maximale Bytelänge an, die für den Ausgabewert eines Parameters in einer gespeicherten Prozedur oder Abfrage zugewiesen ist. Nach diesem Maximum werden die Ausgabewerte abgeschnitten. Der Standardwert ist 255 Byte ohne explizite MAXVARCHARLEN-Klausel. Der gültige Wertebereich liegt zwischen 50 und 32767 Byte.
Im folgenden Beispiel wird die Bytelänge der Ausgabewerte auf 100 begrenzt.
MAXVARCHARLEN 100
PARAMBUFSIZE <bytes>
Geben Sie mit PARAMBUFSIZE die maximale Anzahl von Byte an, die für den Speicherpuffer zulässig sind, der SQLEXEC-Parameterinformationen speichert, einschließlich Eingabe- und Ausgabeparameter. Der Standardwert ist 10.000 Byte ohne explizite PARAMBUFSIZE-Klausel. Der gültige Wertebereich liegt zwischen 1000 und 2000000 Byte. Oracle GoldenGate gibt eine Warnung aus, wenn der für Parameter zugewiesene Speicher innerhalb von 500 Byte des Maximums liegt.
Im folgenden Beispiel wird der Puffer auf 15.000 Byte erhöht.
PARAMBUFSIZE 15000
TRACE {ALL |
ERROR} |
Verwenden Sie TRACE, um SQLEXEC-Eingabe- und -Ausgabeparameter in der Berichtsdatei zu protokollieren.
Im Folgenden finden Sie eine Beispielberichtsdatei mit aktiviertem SQLEXEC-Tracing:
Input parameter values...
LMS_TABLE: INTERACTION_ATTR_VALUES
KEY1: 2818249
KEY2: 1
Report File:
From Table MASTER.INTERACTION_ATTR_VALUES to MASTER.INTERACTION_ATTR_VALUES:
# inserts: 0
# updates: 0
# deletes: 0
# discards: 1
Stored procedure GGS_INTERACTION_ATTR_VALUES:
attempts: 2
successful: 0
ALL
Schreibt die Eingabe- und Ausgabeparameter für jeden Aufruf der Prozedur oder Abfrage in die Berichtsdatei. Dies ist die standardmäßige Einstellung.
ERROR
Die Eingabe- und Ausgabeparameter für jeden Aufruf der Prozedur oder Abfrage werden erst nach einem SQL-Fehler in die Berichtsdatei geschrieben.