Sentencia EXECUTE IMMEDIATE
La sentencia EXECUTE IMMEDIATE prepara una forma ejecutable de una sentencia de SQL a partir de una forma de serie de caracteres de la sentencia y ejecuta la sentencia de SQL.
EXECUTE IMMEDIATE combina las funciones básicas de las sentencias PREPARE y EXECUTE. Puede utilizarse para preparar y ejecutar sentencias de SQL que no contengan variables del lenguaje principal ni marcadores de parámetro.
Invocación
Esta sentencia sólo puede incorporarse en un programa de aplicación. Se trata de una sentencia ejecutable que no puede prepararse de forma dinámica.
Autorización
Las normas de autorización son las que se han definido para la sentencia de SQL especificada.
El ID de autorización de la sentencia podría verse afectado por la opción de enlace DYNAMICRULES.
Sintaxis
Descripción
- expresión
- Expresión que devuelve la serie de sentencia que se va a ejecutar. La expresión debe devolver un tipo de serie de caracteres que sea inferior al tamaño de sentencia máximo de 2.097.152 bytes. Tenga en cuenta que un
CLOB(2097152) puede contener una sentencia de tamaño máximo, pero
VARCHAR no puede. La serie de caracteres de la sentencia debe ser una de las sentencias de SQL siguientes:
- ALTER
- CALL
- COMMENT
- COMMIT
- SQL compuesto (compilado)
- SQL compuesto (en línea)
- CREATE
- DECLARE GLOBAL TEMPORARY TABLE
- DELETE
- DROP
- EXPLAIN
- FLUSH EVENT MONITOR
- FLUSH PACKAGE CACHE
- GRANT
- INSERT
- LOCK TABLE
- MERGE
- REFRESH TABLE
- RELEASE SAVEPOINT
- RENAME
- REVOKE
- ROLLBACK
- SAVEPOINT
- SET COMPILATION ENVIRONMENT
- SET CURRENT DECFLOAT ROUNDING MODE
- SET CURRENT DEFAULT TRANSFORM GROUP
- SET CURRENT DEGREE
- SET CURRENT EXPLAIN MODE
- SET CURRENT EXPLAIN SNAPSHOT
- SET CURRENT FEDERATED ASYNCHRONY
- SET CURRENT IMPLICIT XMLPARSE OPTION
- SET CURRENT ISOLATION
- SET CURRENT LOCALE LC_MESSAGES
- SET CURRENT LOCALE LC_TIME
- SET CURRENT LOCK TIMEOUT
- SET CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION
- SET CURRENT MDC ROLLOUT MODE
- SET CURRENT OPTIMIZATION PROFILE
- SET CURRENT QUERY OPTIMIZATION
- SET CURRENT REFRESH AGE
- SET CURRENT TEMPORAL BUSINESS_TIME
- SET CURRENT TEMPORAL SYSTEM_TIME
- SET ENCRYPTION PASSWORD
- SET EVENT MONITOR STATE (solamente si el comportamiento de ejecución de DYNAMICRULES está en vigor para el paquete)
- SET INTEGRITY
- SET PASSTHRU
- SET PATH
- SET ROLE (solamente si el comportamiento de ejecución de DYNAMICRULES está en vigor para el paquete)
- SET SCHEMA
- SET SERVER OPTION
- SET SESSION AUTHORIZATION
- SET SQL_CCFLAGS
- SET USAGE LIST STATE (solamente si el comportamiento de ejecución de DYNAMICRULES está en vigor para el paquete)
- SET variable
- TRANSFER OWNERSHIP (solamente si el comportamiento de ejecución de DYNAMICRULES está en vigor para el paquete)
- TRUNCATE (solamente si el comportamiento de ejecución de DYNAMICRULES está en vigor para el paquete)
- UPDATE
La serie de sentencia no debe incluir marcadores de parámetro ni referencias a variables del lenguaje principal, y no debe empezar por EXEC SQL. No debe contener un terminador de sentencia, a excepción de las sentencias de SQL compuesto, que pueden contener puntos y coma (;) para separar sentencias dentro del bloque compuesto. En algunas sentencias CREATE y ALTER se utiliza una sentencia de SQL compuesto, por lo que dichas sentencias también pueden contener puntos y coma.
Cuando se ejecuta una sentencia EXECUTE IMMEDIATE, la serie de sentencia se analiza y se comprueba si hay errores. Si la sentencia de SQL no es válida, no se ejecuta y en la SQLCA se informa acerca de la condición de error que evita que pueda ejecutarse. Si la sentencia de SQL es válida, pero se produce un error durante su ejecución, dicha condición de error se informa a la SQLCA.
Notas
- El almacenamiento de sentencias en memoria caché afecta al funcionamiento de la sentencia EXECUTE IMMEDIATE.
Ejemplo
if ( strcmp(accounts,"BIG") == 0 )
strcpy (qstring,"INSERT INTO WORK_TABLE SELECT *
FROM EMP_ACT WHERE ACTNO < 100");
else
strcpy (qstring,"INSERT INTO WORK_TABLE SELECT *
FROM EMP_ACT WHERE ACTNO >= 100");
.
.
.
EXEC SQL EXECUTE IMMEDIATE :qstring;