GET_COLUMN_VALUE_FROM_NAME
Gültig für
Extrakt und Replicat
Beschreibung
Verwenden Sie die Funktion GET_COLUMN_VALUE_FROM_NAME, um den Spaltenwert mit dem angegebenen Spaltennamen aus dem Datensatz abzurufen. Spaltenwerte sind die Grundlage für die meisten Logik innerhalb des User Exit. Sie können komplexe Logik auf den Werten einzelner Spalten im Datensatz basieren.
Wenn die Zeichensession des User Exit mit SET_SESSION_CHARSET auf einen anderen Wert als den Standardzeichensatz des Betriebssystems gesetzt wird, wie in ULIB_CS_DEFAULT in der Datei ucharset.h definiert, werden die Zeichendaten, die zwischen dem User Exit und dem Prozess ausgetauscht werden, im Sessionzeichensatz interpretiert.
Ein Spaltenwert wird nur dann auf den Sessionzeichensatz gesetzt, wenn Folgendes zutrifft:
-
Der Spaltenwert ist ein SQL-Zeichentyp (
CHAR/VARCHAR2/CLOB,NCHAR/NVARCHAR2/NCLOB), ein SQL-Datentyp für Datum/Zeitstempel/Intervall/Zahl -
Der Indikator
column_value_modeist aufEXIT_FN_CNVTED_SESS_CHAR_FORMATgesetzt.
Wenn bei der Datenbank die Groß-/Kleinschreibung beachtet wird, müssen Objektnamen in derselben Groß-/Kleinschreibung angegeben werden, wie sie in der Hostdatenbank definiert sind. Andernfalls spielt die Groß-/Kleinschreibung keine Rolle.
Syntax
#include "usrdecs.h"
short result_code;
column_def column;
ERCALLBACK (GET_COLUMN_VALUE_FROM_NAME, &column, &result_code);
Puffer
typedef struct
{
char *column_value;
unsigned short max_value_length;
unsigned short actual_value_length;
short null_value;
short remove_column;
short value_truncated;
short column_index;
char *column_name;
/* Version 3 CALLBACK_STRUCT_VERSION */
short column_value_mode;
short source_or_target;
/* Version 2 CALLBACK_STRUCT_VERSION */
char requesting_before_after_ind;
char more_lob_data;
/* Version 3 CALLBACK_STRUCT_VERSION */
ULibCharSet column_charset;
} column_def;
Eingabe
<column_value>
Ein Zeiger auf einen Puffer, um den zurückgegebenen Spaltenwert zu akzeptieren.
<max_value_length>
Die maximale Länge des zurückgegebenen Spaltenwertes. Normalerweise entspricht die maximale Länge der Länge des Spaltenwertpuffers. Wenn das ASCII-Format angegeben wird (siehe column_value_mode), ist der Spaltenwert null-terminiert, und die maximale Länge muss der maximalen Länge des Spaltenwertes entsprechen.
<column_name>
Der Name der Spalte für den zurückzugebenden Spaltenwert.
<column_value_mode>
Gibt den Zeichensatz des Spaltenwertes an.
EXIT_FN_CHAR_FORMAT
ASCII-Format: Der Wert ist eine Null-beendete ASCII-Zeichenfolge (oder EBCDIC-Zeichenfolge) (mit einer bekannten Ausnahme für den Unterdatentyp UTF16_BE, der in UTF 8 konvertiert wird). Hinweis: Ein Spaltenwert kann abgeschnitten werden, wenn er einem User Exit angezeigt wird, da der Wert als ASCII-Zeichenfolge interpretiert wird und null-terminiert sein soll. Der erste Wert von 0 wird zum Zeichenfolgenabschlusszeichen.
-
Datumsangaben haben das Format
CCYY-MM-DD HH:MI:SS.FFFFFF, in dem die Bruchzeit datenbankabhängig ist. -
Numerische Werte haben das Zeichenfolgenformat. Beispiel:
123.45wird als"123.45"dargestellt. -
Nicht druckbare Zeichen oder Binärwerte werden in hexadezimale Notation konvertiert.
-
Gleitkommatypen werden als nullbeendete Zeichenfolgen in die ersten 14 signifikanten Ziffern ausgegeben.
EXIT_FN_RAW_FORMAT
Internes kanonisches Oracle GoldenGate-Format: Dieses Format enthält einen Zwei-Byte-Null-Indikator und gegebenenfalls eine Zwei-Byte-Variablendatenlänge. Oracle GoldenGate führt keine Zeichensatzkonvertierung für dieses Format für jeden Zeichendatentyp aus.
EXIT_FN_CNVTED_SESS_CHAR_FORMAT
User Exit-Zeichensatz: Gilt nur, wenn der Spaltendatentyp:
-
ein zeichenbasierter Typ, ein- oder mehrbyte
-
einen numerischen Typ mit einer Zeichenfolgendarstellung
Dieses Format ist nicht Null-beendet.
<source_or_target>
Eine der folgenden Optionen gibt an, ob der Quell- oder Zieldatensatz zum Abrufen des Spaltenwerts verwendet werden soll.
EXIT_FN_SOURCE_VAL
EXIT_FN_TARGET_VAL
<requesting_before_after_ind>
Wird bei der Verarbeitung eines After-Image-Datensatzes festgelegt, und Sie möchten die Before-Spalten einer Aktualisierung oder einer Primärschlüsselaktualisierung verwenden.
Um den "before"-Wert der Spalte bei der Verarbeitung eines "After Image" einer Primärschlüsselaktualisierung oder eines regulären (Nicht-Schlüssel-)Aktualisierungsdatensatzes abzurufen, setzen Sie das Flag requesting_before_after_ind auf BEFORE_IMAGE_VAL.
-
Um auf das Before Image der Schlüsselspalten einer Primärschlüsselaktualisierung zuzugreifen, ist nichts anderes erforderlich.
-
Um auf Nicht-Schlüsselspalten einer Primärschlüsselaktualisierung oder einer Spalte einer regulären Aktualisierung zuzugreifen, muss das Before-Image verfügbar sein.
Die Standardeinstellung ist AFTER_IMAGE_VAL (das After-Image der Spalte abrufen), wenn keine explizite Eingabe für requesting_before_after_ind angegeben ist.
Um ein Before Image verfügbar zu machen, können Sie den Parameter GETUPDATEBEFORES verwenden oder die Option INCLUDEUPDATEBEFORES in der Parameteranweisung CUSEREXIT verwenden.
Beachten Sie Folgendes:
-
GETUPDATEBEFORESbewirkt, dass ein Extract-Prozess Before-Image-Datensätze in den Trail schreibt und außerdem einenEXIT_CALL_PROCESS_RECORD-Aufruf an den User Exit mit den Before Images ausführt. -
INCLUDEUPDATEBEFORESführt weder zu einemEXIT_CALL_PROCESS_RECORD-Aufruf beim User Exit noch dazu, dass der Prozess das Before Image im Trail schreibt.
Ausgabe
<column_value>
Ein Zeiger auf den zurückgegebenen Spaltenwert. Wenn column_value_mode als EXIT_FN_CHAR_FORMAT angegeben ist, wird der Spaltenwert als nullbeendete ASCII-Zeichenfolge zurückgegeben. Andernfalls wird der Spaltenwert im internen kanonischen Oracle GoldenGate-Format zurückgegeben. Im ASCII-Format werden Datumsangaben im folgenden Format zurückgegeben:
CCYY-MM-DD HH:MI:SS.FFFFFF
Die Einbeziehung von Bruchzeiten ist datenbankabhängig.
Istlänge
Die Zeichenfolgenlänge des zurückgegebenen Spaltennamens. Die tatsächliche Länge enthält kein Null-Terminator, wenn column_value_mode als EXIT_FN_CHAR_FORMAT angegeben ist.
<null_value>
Ein Flag (0 oder 1), das angibt, ob der Spaltenwert Null ist. Wenn das Flag null_value 1 ist, wird der Spaltenwertpuffer mit null Byte gefüllt.
<value_truncated>
Ein Flag (0 oder 1), das angibt, ob der Wert abgeschnitten wurde. Das Abschneiden erfolgt, wenn die Länge des Spaltenwertes die maximale Pufferlänge überschreitet. Wenn column_value_mode als EXIT_FN_CHAR_FORMAT angegeben wurde, wird das Null-Terminator in die Länge der Spalte aufgenommen.
Zeichen more_lob_data
Ein Flag, das angibt, ob mehr LOB-Daten über die anfängliche 4K hinaus vorhanden sind, die im Basisdatensatz gespeichert werden können. Wenn eine LOB größer als der Grenzwert 4K ist, wird sie in LOB-Fragmenten gespeichert.
Sie müssen die entsprechende Speichermenge zuweisen, um die zurückgegebenen Werte enthalten zu können. Oracle GoldenGate greift jederzeit auf LOB-Spalten bis zu 8K von Daten zu und füllt den Puffer auf den Betrag auf, den der User Exit zugewiesen hat. Wenn LOB größer als der zugewiesene Wert ist, sind nachfolgende Callbacks erforderlich, um die gesamten Spaltendaten abzurufen, bis alle Daten an den User Exit gesendet wurden.
Um das Ende der Daten zu bestimmen, bewerten Sie more_lob_data. Beim User Exit wird dieses Flag auf CAR_NO_VAL oder CHAR_YES_VAL gesetzt, bevor auf eine neue Spalte zugegriffen wird. Wenn dieses Flag nach dem ersten Callback noch initialisiert wird und nicht auf CHAR_YES_VAL oder CAR_NO_VAL gesetzt ist, gilt eine der folgenden Bedingungen:
-
Es wurde genügend Speicher für die Verarbeitung von
LOBzugewiesen. -
Es ist kein
LOB. -
Es war nicht über dem 4K-Limit der Basistraildatensatzgröße.
Es wird empfohlen, dass Sie die Metadaten der Quelltabelle abrufen, um zu bestimmen, ob eine Spalte eine LOB sein kann.
Rückgabewerte
EXIT_FN_RET_BAD_COLUMN_DATA
EXIT_FN_RET_COLUMN_NOT_FOUND
EXIT_FN_RET_INVALID_COLUMN
EXIT_FN_RET_INVALID_CONTEXT
EXIT_FN_RET_INVALID_PARAM
EXIT_FN_RET_OK
Beispiel
memset (&col_meta, 0, sizeof(col_meta));
if (record.mapped)
col_meta.source_or_target = EXIT_FN_TARGET_VAL;
else
col_meta.source_or_target = EXIT_FN_SOURCE_VAL;
col_meta.source_or_target = EXIT_FN_SOURCE_VAL;
col_meta.column_name = (char *)malloc(100);
col_meta.max_name_length = 100;
col_meta.column_index = 1;
call_callback (GET_COL_METADATA_FROM_NAME, &col_meta, &result_code);