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:

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.

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:

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 , QUERY ' '

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:

'SELECT NAME FROM ACCOUNT WHERE SSN = :SSN AND ACCOUNT = :ACCT'
'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.

<parameter_name> es una de las siguientes opciones:

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

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.