Sentencia SQL compuesto (incorporado)
Combina una o más sentencias de SQL distintas (subsentencias) en un bloque ejecutable.
Invocación
Esta sentencia sólo puede incorporarse en un programa de aplicación. Toda la construcción de la sentencia de SQL compuesto (incorporado) es una sentencia ejecutable que no puede prepararse de forma dinámica. La sentencia no se soporta en REXX.
Autorización
No se requieren privilegios para invocar un SQL compuesto (incorporado). Sin embargo, el ID de autorización de la sentencia debe mantener todos los privilegios necesarios para invocar las sentencias de SQL incorporadas en la sentencia compuesta.
Sintaxis
Descripción
- ATOMIC
- Especifica que, si falla alguna de las subsentencias de la sentencia de SQL compuesto (incorporado), se deshacen todos los cambios efectuados en la base de datos por cualquiera de las subsentencias, incluidos los cambios realizados por subsentencias satisfactorias.
- NOT ATOMIC
- Especifica que, sin tener en cuenta si falla alguna subsentencia, la sentencia de SQL compuesto (incorporado) no deshará ningún cambio efectuado en la base de datos por las otras subsentencias.
- STATIC
- Especifica que las variables de entrada para todas las
subsentencias conservan su valor original. Por ejemplo, si
va seguido de:SELECT ... INTO :abc ...
la sentencia UPDATE utilizará el valor que :abc tenía al principio de la ejecución de la sentencia de SQL compuesto (incorporado), no el valor que sigue a SELECT INTO.UPDATE T1 SET C1 = 5 WHERE C2 = :abcSi más de una subsentencia establece la misma variable, el valor de dicha variable después de la sentencia de SQL compuesto (incorporado) es el valor establecido por la última subsentencia.
Nota: No se da soporte al funcionamiento no estático. Esto quiere decir que la ejecución de las subsentencias no es secuencial y que no deben tener interdependencias. - STOP AFTER FIRST
- Especifica que sólo se ejecutarán un número determinado de subsentencias.
- variable-lenguaje-principal
- Un entero pequeño que especifica el número de subsentencias que se deben ejecutar.
- STATEMENTS
- Completa la cláusula STOP AFTER FIRST variable-lenguaje-principal.
- sentencia-sql-
- Todas las sentencias ejecutables, excepto las
siguientes, pueden estar contenidas en una sentencia de SQL compuesto (incorporado) estática
incorporada:
CALL FETCH CLOSE OPEN CONNECT PREPARE SQL compuesto RELEASE (conexión) DESCRIBE ROLLBACK DISCONNECT SET CONNECTION EXECUTE IMMEDIATE variable SETNota: INSERT, UPDATE y DELETE no reciben soporte en el SQL compuesto para su utilización con apodos.Si se incluye una sentencia COMMIT, debe ser la última subsentencia. Si COMMIT está en esta posición, se emitirá aunque la cláusula STOP AFTER FIRST variable-lenguaje-principal STATEMENTS indique que no deben ejecutarse todas las subsentencias. Por ejemplo, suponga que COMMIT es la última subsentencia en un bloque SQL compuesto formado por 100 subsentencias. Si la cláusula STOP AFTER FIRST STATEMENTS indica que sólo deben ejecutarse 50 subsentencias, entonces COMMIT será la subsentencia número 51.
Se devolverá un error si se incluye COMMIT al utilizar CONNECT TYPE 2 o ejecutar en un entorno de proceso de transacciones distribuidas XA (SQLSTATE 25000).
Normas
- No está permitido ningún código de lenguaje principal en una sentencia de SQL compuesto (incorporado); es decir, no está permitido ningún código de lenguaje principal entre las subsentencias que componen la sentencia de SQL compuesto (incorporado).
- Las sentencias de SQL compuesto (incorporado) no se pueden anidar.
- No se permite una sentencia COMMIT preparada en una sentencia de SQL compuesto (incorporado) ATOMIC.
Notas
- Se devuelve una SQLCA para toda la sentencia de SQL compuesto (incorporado).
La mayor parte de la información de dicha SQLCA refleja los valores
establecidos por el servidor de aplicaciones cuando ha procesado la última
subsentencia. Por ejemplo:
- Normalmente, SQLCODE y SQLSTATE son los que corresponden a la última subsentencia (la excepción se describe en el punto siguiente).
- Si se ha devuelto el aviso
no se han encontrado datos
(SQLSTATE 02000), se da prioridad a ese aviso respecto a cualquier otro aviso con el fin de que pueda realizarse una acción en la excepción WHENEVER NOT FOUND. (Esto significa que los campos SQLCODE, SQLERRML, SQLERRMC y SQLERRP de la SQLCA que finalmente se devuelve a la aplicación son los campos de la subsentencia que ha activado el avisono se han encontrado datos
. Si hay más de un avisono se han encontrado datos
dentro de la sentencia SQL compuesta (incluida), los campos para el último subconjunto serán los campos que se devuelven.) - Los indicadores SQLWARN son una acumulación de los indicadores establecidos para todas las subsentencias.
- Si se han producido uno o varios errores durante la ejecución del SQL compuesto NOT ATOMIC y ninguno de éstos es grave, SQLERRMC contendrá información acerca de estos errores, hasta un máximo de siete errores. El primer
token de SQLERRMC indicará el número total de errores que se han
producido. Los tokens restantes contendrán cada uno la posición ordinal
y el SQLSTATE de la subsentencia anómala dentro de la sentencia de SQL
compuesto (incorporado). El formato es una serie de caracteres en el formato:
en la que la subserie que empieza por X se repite hasta seis veces más y los elementos de la serie están definidos de la manera siguiente.nnnXsssccccc- nnn
- El número total de sentencias que han producido errores. (Si el número excede de 999, el recuento volverá a empezar desde cero.) Este campo se alinea a la izquierda y se rellena con blancos.
- X
- El separador de tokens X'FF'.
- sss
- La posición ordinal de la sentencia que ha provocado el error. (Si
el número excede de 999, el recuento volverá a empezar desde cero.) Por
ejemplo, si la primera sentencia falla, este campo contendría el
número uno alineado a la izquierda (
1
). - ccccc
- El SQLSTATE del error.
- El segundo campo SQLERRD contiene el número de sentencias que han fallado (han devuelto SQLCODE negativos).
- El tercer campo SQLERRD de la SQLCA es una acumulación del número de filas afectadas por todas las subsentencias.
- El cuarto campo SQLERRD de la SQLCA es una cuenta del número de subsentencias satisfactorias. Si, por ejemplo, falla la tercera subsentencia de una sentencia de SQL compuesto (incorporado), el cuarto campo SQLERRD se establecería en 2, lo que indicaría que dos subsentencias se habrían procesado de manera satisfactoria antes de encontrar el error.
- El quinto campo SQLERRD de la SQLCA es una acumulación del número de filas actualizadas o suprimidas a causa de imposición de las restricciones de integridad referencial para todas las subsentencias que han activado dicha actividad de restricción.
Ejemplos
- Ejemplo 1:
En un programa C, emitir una sentencia de SQL compuesto (incorporado) que actualice
las tablas ACCOUNTS y TELLERS. Si hay un error en cualquiera de las sentencias, deshaga el efecto de
todas las sentencias
(ATOMIC). Si no hay errores, confirme la unidad de trabajo actual.
EXEC SQL BEGIN COMPOUND ATOMIC STATIC UPDATE ACCOUNTS SET ABALANCE = ABALANCE + :delta WHERE AID = :aid; UPDATE TELLERS SET TBALANCE = TBALANCE + :delta WHERE TID = :tid; INSERT INTO TELLERS (TID, BID, TBALANCE) VALUES (:i, :branch_id, 0); COMMIT; END COMPOUND; - Ejemplo 2:
En un programa C, inserte 10 filas de datos en la base de datos Suponga que la variable del lenguaje principal :nbr contiene el
valor 10 y S1 es una sentencia INSERT preparada. Además, suponga que todas las inserciones deben intentarse sin tener
en cuenta los errores (NOT ATOMIC).
EXEC SQL BEGIN COMPOUND NOT ATOMIC STATIC STOP AFTER FIRST :nbr STATEMENTS EXECUTE S1 USING DESCRIPTOR :*sqlda0; EXECUTE S1 USING DESCRIPTOR :*sqlda1; EXECUTE S1 USING DESCRIPTOR :*sqlda2; EXECUTE S1 USING DESCRIPTOR :*sqlda3; EXECUTE S1 USING DESCRIPTOR :*sqlda4; EXECUTE S1 USING DESCRIPTOR :*sqlda5; EXECUTE S1 USING DESCRIPTOR :*sqlda6; EXECUTE S1 USING DESCRIPTOR :*sqlda7; EXECUTE S1 USING DESCRIPTOR :*sqlda8; EXECUTE S1 USING DESCRIPTOR :*sqlda9; END COMPOUND;
