GET_COLUMN_VALUE_FROM_NAME
Valido per
Estrai e Replicat
Descrizione
Utilizzare la funzione GET_COLUMN_VALUE_FROM_NAME per recuperare il valore della colonna dal record di dati utilizzando il nome della colonna specificato. I valori di colonna sono alla base della maggior parte della logica all'interno dell'uscita utente. È possibile basare una logica complessa sui valori delle singole colonne all'interno del record di dati.
Se la sessione dei caratteri dell'uscita utente è impostata con SET_SESSION_CHARSET su un valore diverso dal set di caratteri predefinito del sistema operativo, come definito in ULIB_CS_DEFAULT nel file ucharset.h, i dati dei caratteri scambiati tra l'uscita utente e il processo vengono interpretati nel set di caratteri della sessione.
Un valore di colonna viene impostato sul set di caratteri della sessione solo se è vero quanto segue:
-
Il valore della colonna è un tipo di carattere SQL (
CHAR/VARCHAR2/CLOB,NCHAR/NVARCHAR2/NCLOB), una data SQL/indicatore data/ora/intervallo/tipo di numero -
L'indicatore
column_value_modeè impostato suEXIT_FN_CNVTED_SESS_CHAR_FORMAT.
Se il database fa distinzione tra maiuscole e minuscole, i nomi degli oggetti devono essere specificati nella stessa lettera maiuscola definita nel database di hosting; in caso contrario, il caso non importa.
Sintassi
#include "usrdecs.h"
short result_code;
column_def column;
ERCALLBACK (GET_COLUMN_VALUE_FROM_NAME, &column, &result_code);
Buffer
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;
Input
<column_value>
Un puntatore a un buffer per accettare il valore di colonna restituito.
<max_value_length>
La lunghezza massima del valore di colonna restituito. In genere, la lunghezza massima è la lunghezza del buffer dei valori di colonna. Se è specificato il formato ASCII (vedere column_value_mode), il valore della colonna è null-terminated e la lunghezza massima deve essere uguale alla lunghezza massima del valore della colonna.
<column_name>
Il nome della colonna per il valore della colonna da restituire.
<column_value_mode>
Indica il set di caratteri del valore della colonna.
EXIT_FN_CHAR_FORMAT
Formato ASCII: il valore è una stringa ASCII (o EBCDIC) con terminazione nulla (con un'eccezione nota per il tipo di dati secondari UTF16_BE, che viene convertito in UTF 8). Nota: un valore di colonna potrebbe essere troncato quando viene presentato a un'uscita utente, perché il valore viene interpretato come una stringa ASCII e dovrebbe essere nullo. Il primo valore di 0 diventa il terminatore di stringa.
-
Le date sono nel formato
CCYY-MM-DD HH:MI:SS.FFFFFF, in cui il tempo frazionario dipende dal database. -
I valori numerici sono nel formato stringa. Ad esempio,
123.45è rappresentato come"123.45". -
I caratteri non stampabili o i valori binari vengono convertiti in notazione esadecimale.
-
I tipi a virgola mobile vengono generati come stringhe con terminazione nulla, fino alle prime 14 cifre significative.
EXIT_FN_RAW_FORMAT
Formato canonico interno di Oracle GoldenGate: questo formato include un indicatore nullo a due byte e una lunghezza dei dati della variabile a due byte, se applicabile. Oracle GoldenGate non esegue alcuna conversione del set di caratteri per questo formato per alcun tipo di dati carattere.
EXIT_FN_CNVTED_SESS_CHAR_FORMAT
Set di caratteri di uscita utente: si applica solo se il tipo di dati della colonna è:
-
tipo basato su caratteri, singolo o multibyte
-
un tipo numerico con una rappresentazione stringa
Questo formato non è nullo.
<source_or_target>
Una delle seguenti opzioni indica se utilizzare il record di dati di origine o di destinazione per recuperare il valore della colonna.
EXIT_FN_SOURCE_VAL
EXIT_FN_TARGET_VAL
<requesting_before_after_ind>
Impostare quando si elabora un record immagine successivo e si desidera che le colonne precedenti di un aggiornamento o di una chiave primaria.
Per ottenere il valore "prima" della colonna durante l'elaborazione di un "dopo l'immagine" di un aggiornamento della chiave primaria o di un record di aggiornamento regolare (non chiave), impostare il flag requesting_before_after_ind su BEFORE_IMAGE_VAL.
-
Per accedere all'immagine precedente delle colonne chiave di un aggiornamento di chiave primaria, non è necessario altro.
-
Per accedere alle colonne non chiave di un aggiornamento della chiave primaria o di una colonna di un aggiornamento regolare, l'immagine precedente deve essere disponibile.
L'impostazione predefinita è AFTER_IMAGE_VAL (ottenere l'immagine successiva della colonna) quando non viene specificato un input esplicito per requesting_before_after_ind.
Per rendere disponibile un'immagine precedente, è possibile utilizzare il parametro GETUPDATEBEFORES oppure l'opzione INCLUDEUPDATEBEFORES nell'istruzione del parametro CUSEREXIT.
Tenere presente quanto segue.
-
GETUPDATEBEFORESfa sì che un processo Extract scriva record prima dell'immagine nel trail e effettui anche una chiamataEXIT_CALL_PROCESS_RECORDall'uscita utente con le immagini precedenti. -
INCLUDEUPDATEBEFORESnon causa una chiamataEXIT_CALL_PROCESS_RECORDall'uscita utente né, nel caso di Extract, fa sì che il processo scriva l'immagine precedente sul trail.
Output
<column_value>
Un puntatore al valore di colonna restituito. Se column_value_mode è specificato come EXIT_FN_CHAR_FORMAT, il valore della colonna viene restituito come stringa ASCII con termine nullo; in caso contrario, il valore della colonna viene restituito nel formato canonico interno di Oracle GoldenGate. Nel formato ASCII, le date vengono restituite nel seguente formato:
CCYY-MM-DD HH:MI:SS.FFFFFF
L'inclusione del tempo frazionario dipende dal database.
lunghezza effettiva
La lunghezza della stringa del nome colonna restituito. La lunghezza effettiva non include un terminatore nullo quando column_value_mode è specificato come EXIT_FN_CHAR_FORMAT.
<null_value>
Flag (0 o 1) che indica se il valore della colonna è nullo. Se il flag null_value è 1, il buffer dei valori delle colonne viene riempito con byte nulli.
<value_truncated>
Flag (0 o 1) che indica se il valore è stato troncato o meno. Il troncamento si verifica se la lunghezza del valore della colonna supera la lunghezza massima del buffer. Se column_value_mode è stato specificato come EXIT_FN_CHAR_FORMAT, il terminatore nullo viene incluso nella lunghezza della colonna.
carattere more_lob_data
Flag che indica se sono presenti più dati LOB oltre il valore 4K iniziale che possono essere memorizzati nel record di base. Quando un valore LOB è maggiore del limite 4K, viene memorizzato in frammenti LOB.
È necessario allocare la quantità di memoria appropriata per contenere i valori restituiti. Oracle GoldenGate accederà sempre alle colonne LOB fino a 8K di dati, compilando il buffer fino alla quantità allocata dall'uscita utente. Se il valore di LOB è maggiore di quello allocato, i callback successivi sono necessari per ottenere il totale dei dati della colonna, fino a quando tutti i dati non saranno stati inviati all'uscita utente.
Per determinare la fine dei dati, valutare more_lob_data. L'uscita utente imposta questo flag su CAR_NO_VAL o CHAR_YES_VAL prima di accedere a una nuova colonna. Se questo flag viene ancora inizializzato dopo la prima richiamata e non è impostato su CHAR_YES_VAL o CAR_NO_VAL, si verifica una delle seguenti condizioni:
-
È stata allocata una quantità di memoria sufficiente per gestire
LOB. -
Non è un
LOB. -
Non ha superato il limite di 4K della dimensione del record trail di base.
Si consiglia di ottenere i metadati della tabella di origine per determinare se una colonna può essere LOB.
Valori restituiti
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
Esempio
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);