SQLEXEC
Válido para
Extraer y Replicat
Descripción
Utilice el parámetro SQLEXEC para ejecutar un comando de base de datos, consulta o procedimiento almacenado en el contexto del procesamiento de Oracle GoldenGate. SQLEXEC permite a Oracle GoldenGate comunicarse directamente con la base de datos para realizar cualquier trabajo soportado por la base de datos. Este trabajo puede formar parte del proceso de sincronización, como la recuperación de valores para la conversión de columnas, o puede ser independiente de la extracción o replicación de datos, como la ejecución de un procedimiento almacenado que ejecuta una acción en la base de datos.
Nota: SQLEXEC proporciona un soporte de globalización mínimo. Para utilizar SQLEXEC en el archivo de parámetros de captura de la captura de origen, asegúrese de que el juego de caracteres del cliente en el archivo .prm de origen es el mismo o un superjuego del juego de caracteres de la base de datos de origen.
SQLEXEC funciona de la siguiente manera:
-
Como sentencia autónoma en el nivel raíz de un archivo de parámetros para ejecutar un procedimiento o consulta SQL almacenado o para ejecutar un comando de base de datos. Como sentencia autónoma,
SQLEXECse ejecuta independientemente de una sentenciaTABLEoMAPdurante el procesamiento de Oracle GoldenGate. Cuando se utiliza en un parámetroSQLEXECautónomo, una consulta o procedimiento no puede incluir parámetros. Consulte "StandaloneSQLEXEC". -
Como parte de un parámetro
TABLEoMAPpara ejecutar un procedimiento o consulta almacenados con o sin parámetros. Cuando se utiliza con parámetros, el procedimiento o la consulta que se ejecuta puede aceptar parámetros de entrada de filas de origen o de destino y transferir parámetros de salida. Consulte "SQLEXECin aTABLEorMAPParameter". -
En casos de uso de captura remota, el uso de
SQLEXECpuede introducir latencia adicional, ya que la operaciónSQLEXECse debe realizar en serie para cada registro que procese Extract. Si un Extract de hub remoto realiza un filtrado especial que requeriría unSQLEXECy el impacto en el rendimiento es demasiado grave, puede que sea necesario acercar el proceso de Extract a la base de datos de origen. Precaución: Tenga cuidado al ejecutar procedimientosSQLEXECen la base de datos, especialmente en la base de datos de producción. Cualquier cambio que se confirme mediante el procedimiento puede provocar la sobrescritura de datos existentes.
Nota: El parámetro SQLEXECONBEFOREIMAGE soporta la ejecución de SQLEXEC en los registros Antes de imagen.
Nota: El parámetro SQLEXECONBEFOREIMAGE se ignora en el registro de actualización de clave primaria o actualización unificada cuando el tipo EXEC es TRANSACTION, SOURCEROW o ONCE.
SQLEXEC independiente
Un parámetro SQLEXEC autónomo es aquel que se utiliza en el nivel raíz de un archivo de parámetros y actúa independientemente de un parámetro TABLE o MAP. A continuación, se muestran las directrices para utilizar un parámetro SQLEXEC independiente.
-
Una sentencia
SQLEXECautónoma se ejecuta en el orden en que aparece en el archivo de parámetros en relación con otros parámetros. -
Un procedimiento o consulta
SQLEXECdebe contener todo el manejo de excepciones. -
Una consulta o procedimiento se debe estructurar correctamente al ejecutar una sentencia
SQLEXEC, con una sintaxis SQL válida para la base de datos; de lo contrario, Replicat finalizará de forma anormal, independientemente de las reglas de manejo de errores que existan. Consulte la guía de referencia SQL proporcionada por el proveedor de la base de datos para obtener la sintaxis SQL permitida. -
Una credencial de base de datos para el usuario de Oracle GoldenGate debe preceder a la cláusula
SQLEXEC. Para Extract, utilice los parámetrosUSERIDALIASsegún corresponda para la base de datos. Para Replicat, utilice los parámetrosUSERIDALIAS, según corresponda. -
La credencial de base de datos que utiliza el proceso de Oracle GoldenGate es la que ejecuta el SQL. Esta credencial debe tener el privilegio para ejecutar comandos y procedimientos almacenados y llamar a procedimientos proporcionados por la base de datos.
-
No se puede utilizar una sentencia
SQLEXECindependiente para obtener parámetros de entrada de registros o transferir parámetros de salida. Puede utilizar procedimientos almacenados y consultas con parámetros mediante una sentenciaSQLEXECen una sentenciaTABLEoMAP. Consulte "SQLEXECin aTABLEorMAPParameter". -
Todos los objetos afectados por una sentencia
SQLEXECautónoma deben existir antes de que se inicien los procesos de Oracle GoldenGate. Debido a esto, el soporteDDLdebe estar desactivado para esos objetos; de lo contrario, las operacionesDDLpodrían cambiar la estructura o suprimir un objeto antes de que se ejecute la consulta o el procedimientoSQLEXECen él. -
Los nombres de objeto deben estar totalmente cualificados en su formato de nombre de dos o tres partes.
-
Para Db2 en z/OS, Oracle GoldenGate utiliza la función
SQLExecDirectde ODBC para ejecutar una sentencia SQL de forma dinámica. ODBC prepara la sentencia SQL cada vez que se ejecuta, en un intervalo especificado. Para soportar esta función, el servidor de base de datos conectado se debe configurar para preparar SQL de forma dinámica. Para obtener más información, consulte la documentación de z/OS en Db2.
Obtención de más información sobre el uso de SQLEXEC independiente
Consulte Uso de SQLEXEC para ejecutar comandos, procedimientos almacenados y consultas para obtener más información sobre cómo utilizar SQLEXEC.
Sintaxis para SQLEXEC independiente
SQLEXEC
{'call <procedure_name>()' | '<SQL_query>' | '<database_command>'}
[EVERY <n> {SECONDS | MINUTES | HOURS | DAYS}]
[ONEXIT]
[, THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])]
"llamar a <procedure_name ()'>
Especifica el nombre del procedimiento almacenado que se va a ejecutar. Incluya la sentencia entre comillas simples. Se necesita la palabra clave call. A continuación, se muestra un ejemplo de cómo ejecutar un procedimiento con SQLEXEC autónomo:
SQLEXEC 'call prc_job_count ()'
<'SQL_query'>
Especifica el nombre de una consulta que se va a ejecutar. Incluya la consulta entre comillas simples. Especifique nombres de objetos sensibles a mayúsculas/minúsculas en el mismo formato que necesita la base de datos. A continuación se muestra un ejemplo de cómo ejecutar una consulta con SQLEXEC autónomo:
SQLEXEC ' select x from dual '
Para una consulta de varias líneas, utilice las comillas simples de cada línea. Para obtener los mejores resultados, escriba un espacio después de cada comilla inicial y antes de cada comilla final (o al menos antes de cada comilla final).
<'database_command'>
Ejecuta un comando de base de datos. A continuación se muestra un ejemplo de cómo ejecutar un comando de base de datos con SQLEXEC autónomo:
SQLEXEC 'SET TRIGGERS OFF'
EVERY <n> {SECONDS | MINUTES | HOURS | DAYS}
Hace que la consulta o el procedimiento almacenado autónomo se ejecute en un intervalo definido, por ejemplo:
SQLEXEC 'call prc_job_count ()' EVERY 30 SECONDS
El intervalo debe ser un entero positivo.
ONEXIT
Ejecuta el SQL cuando el proceso Extract o Replicat se detiene correctamente, por ejemplo:
SQLEXEC 'call prc_job_count ()' ONEXIT
THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])
Ejecuta SQLEXEC solo para el thread o threads especificados de un Replicat coordinado.
<threadID>[, <threadID>][, ...]
Especifica un thread ID o una lista delimitada por comas de threads con el formato threadID, threadID, threadID.
[, <thread_range>[, <thread_range>][, ...]
Especifica un rango de threads con el formato de threadIDlow-threadIDhigh o una lista de rangos delimitados por comas con el formato de threadIDlow-threadIDhigh, threadIDlow-threadIDhigh.
Se permiten una combinación de estos formatos, como threadID, threadID, threadIDlow-threadIDhigh.
Si no se utiliza ninguna cláusula THREADS, todos los threads configurados para este grupo de Replicat mediante el comando ADD REPLICAT ejecutan el SQL. Sin embargo, si el SQL cumple los criterios para una transacción de barrera, el thread 0 procesa toda la sentencia SQLEXEC independientemente de la asignación de thread real.
SQLEXEC en un parámetro TABLE o MAP
Un parámetro SQLEXEC en un parámetro TABLE o MAP se puede utilizar para ejecutar un procedimiento o consulta almacenados que acepta o no parámetros. A continuación se muestran las dependencias y restricciones SQLEXEC cuando se utilizan en una sentencia MAP o TABLE:
-
El usuario de la base de datos ejecuta el SQL en el que se está ejecutando el proceso de Oracle GoldenGate. Este usuario debe tener el privilegio para ejecutar procedimientos almacenados y llamar a procedimientos proporcionados por la base de datos.
-
Una consulta o procedimiento se debe estructurar correctamente al ejecutar una sentencia
SQLEXEC. Si Replicat encuentra un problema con la consulta o el procedimiento, el proceso finaliza de forma anormal inmediatamente, a pesar de las reglas de manejo de errores existentes. Consulte la guía de referencia SQL proporcionada por el proveedor de la base de datos para obtener la sintaxis SQL permitida. -
La operación
COMMITde una transacción de Replicat en la base de datos destino también confirma los cambiosDMLque se realizan en una sentenciaSQLEXECdentro del límite de la transacción de origen original. Esto no se aplica a Extract porque Extract no realiza transacciones SQL. Al utilizarSQLEXECpara Extract, puede activar confirmaciones implícitas o ejecutar una confirmación explícita en el procedimientoSQLEXEC. -
Especifique literales entre comillas simples. Especifique nombres de objetos sensibles a mayúsculas/minúsculas de la misma forma en que se especifican en la base de datos.
-
No utilice
SQLEXECpara cambiar el valor de una columna de clave primaria. El valor de clave primaria se transfiere de Extract a Replicat. Sin ella, las operaciones de Replicat no se pueden completar. Si los valores de clave primaria se deben cambiar porSQLEXEC, puede evitar errores asignando el valor de clave original a otra columna y, a continuación, definiendo esa columna como clave sustituta con la opciónKEYCOLSde los parámetrosTABLEyMAP. -
Para Db2 en z/OS, Oracle GoldenGate utiliza la función
SQLExecDirectde ODBC para ejecutar una sentencia SQL de forma dinámica. ODBC prepara la sentencia SQL cada vez que se ejecuta, en un intervalo especificado. Para soportar esta función, el servidor de base de datos conectado se debe configurar para preparar SQL de forma dinámica. Para obtener más información, consulte la documentación de z/OS en Db2. -
Al utilizar Oracle GoldenGate para replicar
DDL, todos los objetos afectados por un procedimiento o consulta almacenados deben existir con las estructuras correctas antes de la ejecución del SQL. Por lo tanto,DDLen estos objetos que afectan a la estructura (comoCREATEoALTER) se debe ejecutar antes de que se ejecuteSQLEXEC. -
Todos los nombres de objeto de una sentencia
SQLEXECdeben estar totalmente cualificados con sus nombres de dos o tres partes, según corresponda para la base de datos. -
No utilice
SQLEXECpara las tablas que está procesando un grupo de extracción de pump de datos en modo de transferencia. -
Los siguientes tipos de dato están soportados por
SQLEXECpara los parámetros de entrada y salida.-
Tipos de dato numéricos
-
Tipos de datos de fecha
-
Tipos de dato de caracteres
-
-
Cuando lo ejecuta un Replicat coordinado, el thread o los threads que se especifican con la opción
THREADoTHREADRANGEde la sentenciaMAPejecutanSQLEXEC. Sin embargo, siSQLEXECse especifica en un parámetroMAPque contiene la palabra claveCOORDINATED, el thread con el númeroIDmás bajo ejecuta automáticamente como una transacción de barrera, independientemente de la asignación de thread real.
Sintaxis de SQLEXEC en TABLE o 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>]
Ejecuta un procedimiento almacenado.
SPNAME <procedure_name>
Especifica el nombre del procedimiento que se debe ejecutar.
En el siguiente ejemplo se muestra una única ejecución de un procedimiento almacenado denominado lookup. En este caso, se utiliza el nombre real del procedimiento. No es necesario un nombre lógico.
SQLEXEC (SPNAME lookup), PARAMS (param1 = srccol)), &
COLMAP (targcol = lookup.param1);
ID <logical_name>
Define un nombre lógico opcional para el procedimiento. Por ejemplo, los nombres lógicos para un procedimiento denominado lookup pueden ser lookup1, lookup2, etc. Utilice esta opción para ejecutar el procedimiento varias veces en una sentencia MAP. Un procedimiento puede ejecutarse hasta 20 veces por sentencia MAP. ID no es necesario al ejecutar un procedimiento una vez.
En el siguiente ejemplo se muestra el uso de la opción ID para activar varias ejecuciones de un procedimiento almacenado que obtiene valores de una tabla de consulta. Los valores se asignan a columnas de destino.
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
Ejecuta una consulta.
ID <logical_name>
Define un nombre lógico para la consulta. Se necesita un nombre lógico para extraer valores de los resultados de la consulta. <ID logical_name> hace referencia a los valores de columna devueltos por la consulta.
QUERY '<SQL_query>'
Especifica la sintaxis de consulta SQL que se va a ejecutar en la base de datos. La consulta puede devolver resultados con una sentencia SELECT o ejecutar una sentencia INSERT, UPDATE o DELETE. Una sentencia SELECT solo debe devolver una fila. Si se devuelven varias filas, sólo se procesa la primera fila. No especifique una cláusula INTO ... para ninguna consulta SELECT statements.The debe ser un lenguaje de consulta estándar válido para la base de datos en la que se está ejecutando. La mayoría de las consultas necesitan marcadores de posición para los parámetros de entrada. La forma en que se especifican los parámetros en la consulta depende del tipo de base de datos, de la siguiente forma:
- Para Oracle, los parámetros de entrada se especifican con dos puntos (:) seguidos del nombre del parámetro, como en el siguiente ejemplo.
'SELECT NAME FROM ACCOUNT WHERE SSN = :SSN AND ACCOUNT = :ACCT'
- Para otras bases de datos, los parámetros de entrada se especifican mediante un signo de interrogación, como en el siguiente ejemplo.
'SELECT NAME FROM ACCOUNT WHERE SSN = ? AND ACCOUNT = ?'
La consulta debe estar incluida en una línea, entre comillas simples. Las comillas no son necesarias alrededor de un nombre de parámetro para ninguna base de datos.
Los siguientes ejemplos ilustran el uso de una consulta SQLEXEC para consultas de Oracle y SQL Server, respectivamente.
Ejemplo de Oracle:
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);
Ejemplo de SQL Server:
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
Define si el procedimiento o la consulta aceptan o no parámetros y, en caso afirmativo, asigna los parámetros al origen de entrada. Se debe utilizar una cláusula PARAMS o NOPARAMS.
OPTIONAL |
REQUIRED |
Determina si el procedimiento o la consulta se ejecuta o no cuando faltan valores de parámetros.
OPTIONAL indica que no es necesario un valor de parámetro para que se ejecute SQL. Si falta una columna de origen necesaria en la operación de base de datos o si una función de conversión de columna no se puede completar correctamente porque falta una columna de origen, SQL se ejecuta de todas formas. OPTIONAL es el valor por defecto para todas las bases de datos excepto Oracle. Para Oracle, si un parámetro es opcional o no se determina automáticamente al recuperar la definición de procedimiento almacenada.
REQUIRED indica que un valor de parámetro debe estar presente. Si el valor del parámetro no está presente, el SQL no se ejecutará.
<parameter_name> = {<source_column> | <OGG_function>}
Asigna el nombre de un parámetro a una columna o función que proporciona la entrada. Los siguientes tipos de dato están soportados por SQLEXEC para los parámetros de entrada y salida.
-
Tipos de dato numéricos
-
Tipos de datos de fecha
-
Tipos de dato de caracteres
<parameter_name> es una de las siguientes opciones:
-
Para un procedimiento almacenado, es el nombre de cualquier parámetro del procedimiento que puede aceptar la entrada.
-
Para una consulta de Oracle, es el nombre de cualquier parámetro de entrada de la consulta, excluidos los dos puntos iniciales. Por ejemplo,
:vemplidse especificaría comovempliden la cláusulaPARAMS. Oracle permite asignar un nombre a un parámetro de entrada a cualquier nombre lógico.
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));
- Para una consulta que no es de Oracle, es
P <n>, donde<n>es el número del parámetro dentro de la sentencia, empezando por 1. Por ejemplo, en una consulta con dos parámetros, las entradas<parameter_name>sonp1 and p2. Considere si la base de datos necesita quepsea mayúscula o minúscula.
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> es el nombre de una columna de origen que proporciona la entrada. De forma predeterminada, si la columna especificada no está presente en el log (porque el registro solo contiene los valores de las columnas que se actualizaron), el parámetro asume cualquier valor predeterminado especificado por el procedimiento o la consulta para el parámetro.
<OGG_function> es el nombre de una función de conversión de columna de Oracle GoldenGate que se ejecuta para proporcionar la entrada. Consulte "Funciones de Asignación de Tablas y Columnas".
Para transferir valores de salida del procedimiento o consulta almacenados como entrada a una cláusula FILTER o COLMAP, utilice la siguiente sintaxis:
{<procedure_name> | <logical_name>}.<parameter>
Dónde:
-
<procedure_name>es el nombre real de un procedimiento almacenado, que debe coincidir con el valor proporcionado paraSPNAMEen la sentenciaSQLEXEC. Utilice este argumento solo si ejecuta un procedimiento una vez durante el curso de la ejecución de Oracle GoldenGate. -
<logical_name>es el nombre lógico especificado con la opciónIDdeSQLEXEC. Utilice este argumento para transferir valores de entrada de una consulta o de una instancia de un procedimiento almacenado cuando el procedimiento se ejecuta varias veces en una sentenciaMAP. -
<parameter>es el nombre de un parámetro oRETURN_VALUEsi se extraen los valores devueltos. Por defecto, los valores de salida se truncan a 255 bytes por parámetro. Si los parámetros de salida deben ser más largos, utilice la opciónMAXVARCHARLEN. Nota: Como alternativa a la sintaxis anterior, puede utilizar la función@GETVAL.
Los siguientes ejemplos se aplican a un juego de tablas de origen y destino de Oracle y a una tabla de consulta. Estos ejemplos muestran cómo se transfieren los parámetros de las tablas para una única instancia de un procedimiento almacenado y varias instancias de un procedimiento almacenado.
Cliente de tabla de origen:
custid Number
current_residence_state Char(2)
birth_state Char(2)
Tabla de destino cust_extended:
custid Number
current_residence_state_long Varchar(30)
birth_state_long Varchar(30)
Tabla de consulta state_lookup
abbreviation Char(2)
long_name Varchar(30)
En el siguiente ejemplo se muestra el uso de un procedimiento almacenado que se ejecuta una vez para obtener un valor de la tabla de consulta. Al procesar registros de la tabla cust, Oracle GoldenGate ejecuta el procedimiento almacenado lookup antes de ejecutar la asignación de columnas. El parámetro long_name del procedimiento acepta la entrada del valor column.The del origen birth_state se asigna a la columna de destino birth_state_long en la sentencia COLMAP.
MAP sales.cust, TARGET sales.cust_extended, &
SQLEXEC (SPNAME lookup, &
PARAMS (long_name = birth_state)), &
COLMAP (custid = custid, &
birth_state_long = lookup.long_name);
En el siguiente ejemplo se muestra el uso de la opción ID para activar varias ejecuciones de un procedimiento almacenado que obtiene valores de una tabla de consulta. Los valores se asignan a columnas de destino.
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 |
Utilice AFTERFILTER y BEFOREFILTER para especificar cuándo ejecutar el procedimiento o la consulta almacenados en relación con la cláusula FILTER de una sentencia MAP.
AFTERFILTER
Hace que el SQL se ejecute después de la sentencia FILTER. Esto le permite omitir la sobrecarga de ejecución de SQL a menos que el filtro se realice correctamente. Éste es el estado por defecto.
BEFOREFILTER
Hace que el SQL se ejecute antes de la sentencia FILTER, por lo que los resultados se pueden utilizar en el filtro.
A continuación, se muestra un ejemplo con BEFOREFILTER.
SQLEXEC (SPNAME check, NOPARAMS, BEFOREFILTER)
ALLPARAMS [OPTIONAL |
REQUIRED] |
Utilice ALLPARAMS como regla global que determina si todos los parámetros especificados deben estar presentes o no para que se ejecute la consulta o el procedimiento almacenados. Las reglas para parámetros individuales establecidos en la cláusula PARAMS sustituyen el juego de reglas global por ALLPARAMS.
OPTIONAL
Permite que el SQL ejecute si todos los parámetros están presentes o no. Éste es el estado por defecto.
REQUIRED
Necesita que todos los parámetros estén presentes para que se ejecute SQL.
A continuación, se muestra un ejemplo con OPTIONAL.
SQLEXEC (SPNAME lookup,
PARAMS (long_name = birth_state, short_name = state),
ALLPARAMS OPTIONAL)
ERROR {IGNORE |
REPORT |
RAISE |
FINAL |
FATAL} |
Utilice ERROR para definir una respuesta a los errores asociados al procedimiento o consulta almacenados. Sin un manejo de errores explícito, el proceso de Oracle GoldenGate termina de forma anormal en los errores. Asegúrese de que los procedimientos devuelven errores al proceso y especifique las respuestas con ERROR.
Con Oracle GoldenGate 21c, la funcionalidad permite especificar diferentes comportamientos según el tipo de error SQL.
En el siguiente ejemplo se muestra un proceso ER de fin anormal cuando se detecta el código de error SQL 1403 o 1405 al ejecutar la consulta de procedimiento almacenado. Se informan todos los demás errores y la replicación continúa.
SQLEXEC ( SPNAME lookup,
PARAMS( long_name = birth_state, short_name = state),
ERROR REPORT, ERROR FATAL (1403, 1405) );
IGNORE
Hace que Oracle GoldenGate ignore todos los errores asociados al procedimiento o consulta almacenados y continúe el procesamiento. Cualquier extracción de parámetros resultante da como resultado condiciones de "columna faltante". Éste es el estado por defecto.
REPORT
Garantiza que todos los errores asociados al procedimiento o consulta almacenados se informen al archivo de desecho. El informe es útil para rastrear la causa del error. Incluye una descripción de error y el valor de los parámetros transferidos desde y hacia el procedimiento o consulta. Oracle GoldenGate continúa el procesamiento después de informar del error.
RAISE
Maneja los errores según las reglas definidas por un parámetro REPERROR. Oracle GoldenGate sigue procesando otros procedimientos almacenados o consultas asociadas a la sentencia MAP actual antes de procesar el error.
FINAL
Es similar a RAISE, excepto que cuando se encuentra un error asociado a un procedimiento o consulta, se omiten los procedimientos almacenados restantes y las consultas. El procesamiento de errores se llama inmediatamente después del error.
FATAL
Hace que Oracle GoldenGate finalice de forma anormal inmediatamente después de encontrar un error asociado a un procedimiento o consulta.
EXEC {MAP |
ONCE |
TRANSACTION |
SOURCEROW} |
Utilice EXEC para controlar la frecuencia con la que se ejecuta un procedimiento o consulta almacenados en una sentencia MAP y cuánto tiempo se consideran válidos los resultados si se extraen los parámetros de salida.
MAP
Ejecuta el procedimiento o la consulta una vez para cada asignación de tabla origen-destino para la que se especifica. Con MAP, los resultados no son válidos para las asignaciones posteriores que tengan la misma tabla de origen. MAP es el valor por defecto.
En el siguiente ejemplo se muestra el uso incorrecto del valor por defecto MAP. Dado que MAP es el valor por defecto, no es necesario que se muestre explícitamente en la sentencia SQLEXEC. En este ejemplo, una tabla de origen se asigna en parámetros MAP independientes a dos tablas de destino diferentes. En este caso, los resultados solo son válidos para la primera asignación. Los resultados del procedimiento lookup caducan cuando se ejecuta el segundo parámetro MAP y el segundo MAP da como resultado una condición de "falta columna". Para implementar esto correctamente para que cada MAP devuelva resultados válidos, se debe utilizar SOURCEROW.
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
Ejecuta el procedimiento o la consulta una vez durante el curso de la ejecución de Oracle GoldenGate, tras la primera llamada de la sentencia MAP asociada. Los resultados seguirán siendo válidos mientras el proceso siga en ejecución.
A continuación, se muestra un ejemplo del uso de 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
Ejecuta el procedimiento o la consulta una vez por transacción de origen. Los resultados siguen siendo válidos para todas las operaciones de la transacción.
A continuación, se muestra un ejemplo del uso de 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
Ejecuta el procedimiento o la consulta una vez por cada operación de fila de origen. Utilice esta opción al sincronizar una tabla de origen con más de una tabla de destino, de modo que los resultados del procedimiento o consulta se llamen para cada asignación de origen-destino.
A continuación, se muestra un ejemplo del uso de SOURCEROW. En este caso, la segunda asignación devuelve un valor válido porque el procedimiento se ejecuta en cada operación de fila de origen.
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>
Utilice MAXVARCHARLEN para especificar la longitud máxima de bytes asignada para el valor de salida de cualquier parámetro en un procedimiento o consulta almacenados. Más allá de este máximo, los valores de salida se truncan. El valor por defecto es 255 bytes sin una cláusula MAXVARCHARLEN explícita. El rango válido de valores es de 50 a 32767 bytes.
El ejemplo siguiente limita la longitud de bytes de los valores de salida a 100.
MAXVARCHARLEN 100
PARAMBUFSIZE <bytes>
Utilice PARAMBUFSIZE para especificar el número máximo de bytes permitidos para el buffer de memoria que almacena la información del parámetro SQLEXEC, incluidos los parámetros de entrada y de salida. El valor por defecto es 10.000 bytes sin una cláusula PARAMBUFSIZE explícita. El rango de valores válido es de 1000 a 2000000 bytes. Oracle GoldenGate emite una advertencia siempre que la memoria asignada para los parámetros esté dentro de los 500 bytes del máximo.
En el siguiente ejemplo, se aumenta el buffer a 15.000 bytes.
PARAMBUFSIZE 15000
TRACE {ALL |
ERROR} |
Utilice TRACE para registrar los parámetros de entrada y salida SQLEXEC en el archivo de informe.
A continuación se muestra un archivo de informe de ejemplo con el rastreo SQLEXEC activado:
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
Escribe los parámetros de entrada y salida para cada llamada del procedimiento o consulta en el archivo de informe. Éste es el estado por defecto.
ERROR
Escribe los parámetros de entrada y salida para cada llamada del procedimiento o consulta en el archivo de informe solo después de que se produzca un error SQL.