SQL Embebido

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 7

Que es el SQL Embebido:

Son sentencias SQL ejecutables que solo se pueden utilizar en un Fuente.


La sentencia PREPARE se utiliza por los programas de aplicación para preparar dinámicamente una sentencia
de SQL para ejecución. La sentencia PREPARE crea una sentencia de SQL ejecutable, llamada una sentencia
preparada, a partir de una forma de sentencia de serie de caracteres, denominada una serie de sentencia.
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
Para las sentencias en las que el control de autorizaciones se realiza al preparar la sentencia (DML), los
privilegios del ID de autorización de la sentencia deben incluir los necesarios para ejecutar la sentencia de
SQL especificada por la sentencia PREPARE. El ID de autorización de la sentencia podría verse afectado por la
opción de enlace DYNAMICRULES.
En el caso de las sentencias en las que el control de autorizaciones se realiza durante la ejecución de la
sentencia (sentencias DDL, GRANT y REVOKE), no es necesaria ninguna autorización para utilizar esta
sentencia; no obstante, se comprueba la autorización cuando se ejecuta la sentencia preparada.
Para las sentencias que afectan a las tablas protegidas con una política de seguridad, las normas asociadas
con la política de seguridad siempre se evaluarán durante el tiempo de ejecución de la sentencia.
Si el ID de autorización de las sentencias contiene una autorización EXPLAIN, SQLADM o DBADM, el usuario
puede preparar cualquier sentencia; no obstante, la capacidad para ejecutar la sentencia se vuelve a
comprobar en el momento de la ejecución de la sentencia.
Sintaxis
Leer el esquema de sintaxisOmitir el esquema de sintaxis visual
>>-PREPARE--nombre-sentencia------------------------------------>

>--+-----------------------------------------------+------------>
| .-OUTPUT-. |
'-+--------+--INTO--nombre-descriptor-resultado-'

>--+---------------------------------------+-------------------->
'-INPUT INTO--nombre-descriptor-entrada-'

>--FROM--+-variable-lenguaje-principal-+-----------------------><
'-expresión-------------------'
Descripción
nombre-sentencia
Identifica la sentencia preparada. Si el nombre identifica una sentencia preparada existente, se destruye
dicha sentencia preparada previamente. El nombre no debe identificar ninguna sentencia preparada que sea
la sentencia SELECT de un cursor abierto.
OUTPUT INTO
Si se utiliza OUTPUT INTO y la sentencia PREPARE se ejecuta satisfactoriamente, se colocará información
acerca de los marcadores de parámetro de salida de la sentencia preparada en la SQLDA que nombre-
descriptor-resultado especifica.
nombre-descriptor-resultado
Especifica el nombre de una SQLDA. (Como alternativa a esta cláusula, puede utilizarse la sentencia
DESCRIBE.)
INPUT INTO
Si se utiliza INPUT INTO y la sentencia PREPARE se ejecuta satisfactoriamente, se colocará información acerca
de los marcadores de parámetro de entrada de la sentencia preparada en la SQLDA que nombres-descriptor-
entrada especifica. Los marcadores de parámetro de entrada se consideran siempre como con posibilidad de
nulos, independientemente de su uso.
nombre-descriptor-entrada
Especifica el nombre de una SQLDA. (Como alternativa a esta cláusula, puede utilizarse la sentencia
DESCRIBE.)
FROM
Especifica la serie de la sentencia. La serie de la sentencia es el valor de la variable del lenguaje principal
especificada.
variable-lenguaje-principal
Especifica una variable del lenguaje principal que se ha descrito en el programa de acuerdo con las normas
para la declaración de variables de serie de caracteres. Debe ser una variable de serie de caracteres de
longitud que puede variar cuyo tamaño sea menor que el 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 un VARCHAR
no puede.
expresión
Expresión que especifica la serie de la sentencia. La expresión debe devolver un tipo de serie de caracteres
de longitud variable o fija que sea inferior al tamaño de sentencia máximo de 2.097.152 bytes.
Normas
Normas para las sentencias: La sentencia debe ser una sentencia ejecutable que se pueda preparar
dinámicamente. 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
sentencia-select
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
Notas
Marcadores de parámetro: Aunque una serie de sentencia no puede incluir referencias a variables de lenguaje
principal, puede incluir marcadores de parámetro. Estos pueden sustituirse por los valores de las variables del
lenguaje principal cuando se ejecuta la sentencia preparada. En el caso de una sentencia CALL, también
puede utilizarse un marcador de parámetro para los argumentos OUT e INOUT para el procedimiento. Tras
haberse ejecutado CALL, e
Un marcador de parámetros es un signo de interrogación (?) o un signo de dos puntos seguido de un nombre
(:nombre) que se utiliza donde se pueda utilizar una variable del lenguaje principal si la serie de la sentencia
fuera una sentencia de SQL estático. Para obtener una explicación sobre cómo se sustituyen los marcadores
de parámetro por valores, consulte OPEN y EXECUTE.

Si se asigna un nombre al marcador de parámetro, el nombre puede incluir letras, números y los símbolos @,
#, $ y _. El nombre no se convierte a mayúsculas.

Los marcadores de parámetro con nombre tienen la misma sintaxis que las variables del lenguaje principal,
aunque estos dos no son intercambiables. Una variable del lenguaje principal tiene un valor y se utiliza
directamente en una sentencia de SQL estático. Un marcador de parámetro con nombre es un espacio
reservado para un valor en una sentencia de SQL dinámico y el valor se suministra al ejecutarse la sentencia.

Existen dos tipos de marcadores de parámetro:


Marcador de parámetro con tipo
Es un marcador de parámetros que se especifica junto con su tipo de datos de destino. Tiene el formato
general:
CAST(? AS tipo-datos)Copiar
Esta notación no es una llamada a función, sino una "promesa" de que el tipo del parámetro en tiempo de
ejecución será el tipo de datos especificado o algún otro tipo de datos que pueda convertirse en el tipo de
datos especificado. Por ejemplo, en:
UPDATE EMPLOYEE
SET LASTNAME = TRANSLATE(CAST(? AS VARCHAR(12)))
WHERE EMPNO = ?Copiar
el valor del argumento de la función TRANSLATE se proporcionará en tiempo de ejecución. El tipo de datos de
dicho valor será VARCHAR(12) o algún tipo que pueda convertirse a VARCHAR(12).
Marcador de parámetro sin tipo
Es un marcador de parámetro que se especifica sin su tipo de datos de destino. Consta de un signo de
interrogación individual. El tipo de datos de un marcador de parámetro sin tipo lo proporciona el contexto.
Por ejemplo, el marcador de parámetros sin tipo del predicado de la sentencia de actualización anterior es el
mismo que el tipo de datos de la columna EMPNO.
Los marcadores de parámetro con tipo pueden utilizarse en sentencias de SQL dinámico donde esté soportada
una variable del lenguaje principal y el tipo de datos se base en la promesa realizada en la función CAST.

Los marcadores de parámetro sin tipo se pueden utilizar en las sentencias de SQL dinámico siempre y cuando
el tipo de datos del marcador de parámetro se pueda calcular basándose en el contexto de la sentencia de
SQL (SQLSTATE 42610).

En el ejemplo siguiente se obtiene un error, ya que c1 se resolvería en el primer contexto en un tipo de datos
de serie, mientras que en el segundo contexto c1 se resolvería en un tipo de datos numérico:
SELECT 'Hello' || c1, 5 + c1 FROM (VALUES(?)) AS T(c1)Copiar
No obstante, la sentencia siguiente es correcta, ya que el marcador de parámetro asociado con la columna
derivada, c1, se resolvería en un tipo de datos numérico en ambos contextos:
SELECT 7 + c1, 5 + c1 FROM (VALUES(?)) AS T(c1)Copiar
Consulte Determinación de los tipos de datos de las expresiones sin tipo para conocer las normas de
establecimiento de tipo de un marcador de parámetro sin tipo.
Cuando se ejecuta una sentencia PREPARE, la serie de sentencia se analiza y se comprueba si hay errores. Si
la sentencia no es valida, la condición de error se notifica en la SQLCA. Cualquier sentencia EXECUTE u OPEN
que hace referencia a esta sentencia también recibirá el mismo error (debido a una preparación implícita
realizada por el sistema) a menos que se haya corregido el error.
Se puede hacer referencia a sentencias preparadas en las siguientes clases de sentencias, con las restricciones
que se indican:
En...
La sentencia preparada...
DESCRIBE
puede ser cualquier sentencia
DECLARE CURSOR
debe ser SELECT
EXECUTE
no debe ser SELECT
Una sentencia preparada se puede ejecutar muchas veces. En efecto, si una sentencia preparada no se ejecuta
más de una vez y no contiene marcadores de parámetro, es más eficaz utilizar la sentencia EXECUTE
IMMEDIATE en lugar de las sentencias PREPARE y EXECUTE.
Todas las sentencias preparadas que ha creado una unidad de trabajo permanecen en estado preparado hasta
que la aplicación finaliza, con las siguientes excepciones:
Una sentencia que se haya preparado dentro de un paquete vinculado con KEEPDYNAMC NO y que un cursor
abierto declarado con la opción WITH HOLD no utilice ya no está en estado preparado cuando la unidad de
trabajo finaliza.
Una sentencia dinámica vinculada con KEEPDYNAMIC NO y que un cursor abierto declarado con la opción WITH
HOLD utilice está en un estado preparado hasta el siguiente límite de unidad de trabajo en el que se cierre el
cursor.
Ejemplos
Ejemplo 1: Prepare y ejecute una sentencia que no es de selección en un programa COBOL. Suponga que la
sentencia está contenida en una variable del lenguaje principal HOLDER y que el programa sustituirá una serie
de sentencia de una variable del lenguaje principal basada en algunas instrucciones del usuario. La sentencia
que se debe preparar no tiene ningún marcador de parámetros.
EXEC SQL PREPARE STMT_NAME FROM :HOLDER
END-EXEC.
EXEC SQL EXECUTE STMT_NAME
END-EXEC.Copiar
Ejemplo 2: Prepare y ejecute una sentencia que no es de selección como en el ejemplo 1, excepto codificada
para un programa C. Suponga también que la sentencia que se va a preparar puede contener cualquier
cantidad de marcadores de parámetro.
EXEC SQL PREPARE STMT_NAME FROM :holder;
EXEC SQL EXECUTE STMT_NAME USING DESCRIPTOR :insert_da;Copiar
Suponga que se debe preparar la sentencia siguiente:
INSERT INTO DEPT VALUES(?, ?, ?, ?)Copiar
Las columnas de la tabla DEPT se definen de la siguiente manera:

DEPT_NO CHAR(3) NOT NULL, -- número de departamento


DEPTNAME VARCHAR(29), -- nombre del departamento
MGRNO CHAR(6), -- número del director
ADMRDEPT CHAR(3) -- número del departamento de administraciónCopiar
Para insertar el número de departamento G01 que se denomina COMPLAINTS, que no tiene ningún director y
que informa al departamento A00, la cláusula INSERT_DA debe tener los valores de la Tabla 1 antes de emitirse
la sentencia EXECUTE.

También podría gustarte