Sentencia de SQL compuesto (compilado)
Una sentencia SQL compuesta (compilada) puede contener sentencias de control SQL y sentencias SQL. Las sentencias SQL compuestas (compiladas) se pueden utilizar para implementar la lógica de procedimiento a través de una secuencia de sentencias SQL con un ámbito local para variables, condiciones, cursores y manejadores.
Invocación
Esta sentencia puede incorporarse a un activador, una función de SQL o un procedimiento de SQL, o puede emitirse mediante el uso de sentencias de SQL dinámico. Se trata de una sentencia ejecutable que puede prepararse de forma dinámica.
Autorización
Para una declaración-variable-SQL que especifica un constructor-valor-cursor que utiliza una sentencia-select, los privilegios del ID de autorización de la sentencia deben incluir los privilegios necesarios para ejecutar la sentencia-select. Consulte la sección Autorización en "Consultas de SQL".
Los privilegios que mantiene el ID de autorización de la sentencia deben incluir también todos los privilegios necesarios para invocar las sentencias de SQL especificadas en la sentencia compuesta.
Los objetos SQL especificados dentro del cuerpo de la sentencia compuesta pueden tener en cuenta los privilegios de grupo PUBLIC.
Sintaxis
- 1 La cláusula FOR BIT DATA se puede especificar en cualquier orden con las restricciones de columna siguientes. La cláusula FOR BIT DATA no se puede especificar con unidades de serie CODEUNITS32 (SQLSTATE 42613).
- 2 Si tipo-datos4 especifica un tipo incorporado CURSOR o un nombre-tipo-cursor, solamente pueden especificarse NULL o constructor-valor-cursor. Sólo puede especificarse de forma explícita DEFAULT NULL para nombre-tipo-matriz o nombre-tipo-fila.
- 3 Sólo puede especificarse de forma explícita DEFAULT NULL para nombre-tipo-matriz.
- 4 Sólo puede especificarse de forma explícita DEFAULT NULL para nombre-tipo-fila.
- 5 El nombre-sentencia no se puede especificar si se ha especificado la declaración-parámetro-cursor.
Descripción
- etiqueta
- Define la etiqueta del bloque de programa. Si se especifica la etiqueta inicial, se puede utilizar para calificar variables de SQL declaradas en la sentencia compuesta y también se puede especificar en una sentencia LEAVE. Si se especifica una etiqueta final, ésta deberá ser igual que la etiqueta inicial.
- ATOMIC o NOT ATOMIC
- ATOMIC indica que si se produce una condición de excepción no
manejada en la sentencia compuesta, se retrotraerán todas las
sentencias de SQL de la sentencia compuesta.
NOT ATOMIC indica que una condición de excepción no manejada dentro de la sentencia compuesta no da lugar a la retrotracción de la sentencia compuesta.
Si se especifica la palabra clave ATOMIC en una sentencia compuesta preparada dinámicamente o una función de SQL que no está en un módulo, la sentencia compuesta se procesa como si se tratara de una sentencia de SQL compuesto (en línea).
Una sentencia compuesta que se utiliza en el cuerpo de la función de una función de tabla de módulo solo puede definirse como NOT ATOMIC.
- declaración-tipo
- Declara un tipo de datos definido por el usuario que es local respecto a la sentencia compuesta.
- nombre-tipo
- Especifica el nombre de un tipo de datos definido por el usuario local. El nombre no puede ser igual que cualquier otro tipo declarado dentro de la sentencia compuesta actual (SQLSTATE 42734). El nombre-tipo sin calificar tiene las mismas restricciones que las descritas en cualquier sentencia CREATE TYPE (SQLSTATE 42939).
- definición-tipo-matriz
- Especifica los atributos de un tipo de datos de matriz que se deben asociar con el
nombre-tipo. Consulte
CREATE TYPE (matriz)
para obtener una descripción de los elementos de sintaxis. El nombre-tipo-fila puede hacer referencia a un tipo de fila declarado que se haya declarado previamente y que esté en el ámbito de la sentencia de SQL compuesto (compilado) actual. El nombre-variable especificado está en una cláusula de tipo-datos-anclados puede hacer referencia a una variable local en el ámbito de la sentencia de SQL compuesto (compilado) actual. - definición-tipo-diferenciado
- Especifica las restricciones de tipo de fuente y de tipo de datos opcionales de un tipo diferenciado con tipo no firme que ha de asociarse al nombre-tipo. Consulte el apartado "CREATE TYPE (diferenciado)" para obtener una descripción completa de los elementos de la sintaxis. El nombre-variable especificado en una cláusula de tipo-datos-anclados puede hacer referencia a una variable local en el ámbito de la sentencia de SQL compuesto (compilado) actual. El tipo de datos del nombre-variable o nombre-columna de anclaje debe ser un tipo de datos incorporado.
- definición-tipo-fila
- Especifica los campos de un tipo de datos de fila que se deben asociar con el nombre-tipo.
Consulte
CREATE TYPE (fila)
para obtener una descripción completa de los elementos de sintaxis. El nombre-variable especificado está en una cláusula de tipo-datos-no-fila anclados puede hacer referencia a una variable local en el ámbito de la sentencia de SQL compuesto (compilado) actual.
- declaración-variable-SQL
- Declara una variable que es local respecto a la sentencia compuesta.
- nombre-variable-SQL
- Define el nombre de una variable local. Todos los nombres de variables de SQL se convierten en mayúsculas. El nombre no puede ser el mismo que otra variable de SQL existente en la misma sentencia compuesta y no puede ser igual que un nombre de parámetro. El nombre de una variable de SQL no debe ser el mismo que el de un nombre de columna. Si una sentencia de SQL contiene un identificador que tiene el mismo nombre que una variable de SQL y una referencia a columna, el identificador se interpreta como una columna. Si la sentencia compuesta en la que se ha declarado la variable se ha etiquetado, las referencias a la variable pueden calificarse con la etiqueta. Por ejemplo, a la variable V declarada en una sentencia compuesta que se ha etiquetado con C puede hacerse referencia como C.V.
- tipo4-datos
- Especifica el tipo de datos de la variable. No se puede especificar tipos estructurados ni tipos de referencia (SQLSTATE 429BB).
- tipo-incorporado
- Especifica un tipo de datos incorporado. Para obtener una descripción más completa de cada tipo de datos incorporado excepto BOOLEAN y CURSOR, que no pueden especificarse para una tabla, consulte el apartado "CREATE TABLE". No puede especificarse el tipo de datos XML en sentencias de SQL compuesto (compilado) utilizadas en un activador, en una función o como sentencia independiente (SQLSTATE 429BB). El tipo de datos XML puede especificarse cuando la sentencia de SQL compuesto (compilado) se utiliza en el cuerpo de un procedimiento de SQL.
- BOOLEAN
- Para un booleano.
- CURSOR
- Para un cursor.
- tipo-datos-anclados
- Identifica otro objeto que se utiliza para determinar el tipo
de datos de la variable de SQL. El tipo de datos del objeto de anclaje tiene las mismas limitaciones que se aplican a la especificación del tipo de datos directamente o, en el caso de una fila, a la creación de un tipo de fila.
- ANCHOR DATA TYPE TO
- Indica que se utiliza un tipo de datos anclados para especificar el
tipo de datos.
- nombre-variable
- Identifica una variable de SQL, un parámetro de SQL o una variable global. El tipo de datos de la variable a la que se hace referencia se utiliza como tipo de datos para el nombre-variable-SQL.
- nombre-tabla.nombre-columna
- Identifica un nombre de columna de una tabla o vista existente. El tipo de datos de la columna se utiliza como tipo de datos para el nombre-variable-SQL.
- ROW OF nombre-tabla o nombre-vista
- Especifica una fila de campos con nombres y tipos de datos que se basan en los nombres de columna y los tipos de datos de columna de la tabla identificada por nombre-tabla o la vista identificada por nombre-vista. El tipo de datos del nombre-variable-SQL es un tipo de fila sin nombre.
- ROW OF nombre-variable-cursor
- Especifica una fila de campos con nombres y tipos de datos que se basan en
los nombres de campo y los tipos de datos de campos de la variable de
cursor identificada por nombre-variable-cursor. La variable de cursor especificada debe ser uno de los elementos siguientes (SQLSTATE 428HS):
- Una variable de SQL o una variable global con un tipo de datos de cursor con tipo firme.
- Una variable SQL o variable global con un tipo de datos de cursos escritos débilmente que se creó o declaró con una cláusula CONSTANT que especifica una sentencia-seleccionar en donde se nombran todas las columnas de resultados.
- nombre-tipo-matriz
- Especifica el nombre de un tipo de matriz definido por el usuario. El tipo de datos de matriz puede ser un tipo de datos declarado localmente, un tipo de datos de esquema o un tipo de datos de módulo.
- nombre-tipo-cursor
- Especifica el nombre de un tipo de cursor. El tipo de datos de cursor puede ser un tipo de datos de esquema o un tipo de datos de módulo.
- nombre-tipo-diferenciado
- Especifica el nombre de un tipo diferenciado. El tipo de datos diferenciado puede ser un tipo de datos de esquema o un tipo de datos de módulo. La longitud, la precisión y la escala de la variable declarada son, respectivamente, la longitud, la precisión y la escala del tipo fuente del tipo diferenciado.
- nombre-tipo-fila
- Especifica el nombre de un tipo de fila definido por el usuario. El tipo de datos de fila puede ser un tipo de datos declarado localmente, un tipo de datos de esquema o un tipo de datos de módulo. Los campos de la variable son los campos del tipo de fila.
- DEFAULT o CONSTANT
- Especifica un valor para la variable de SQL cuando se hace referencia a la sentencia de SQL compuesto (compilado). Si no se especifica ninguna, el valor por omisión para la variable de SQL
es el valor nulo. Sólo puede especificarse de forma explícita DEFAULT NULL si está especificadonombre-tipo-matriz o nombre-tipo-fila.
- DEFAULT
- Define el valor por omisión de la variable de SQL. La variable se inicializa cuando se hace referencia a la sentencia de SQL compuesto (compilado). El valor por omisión debe ser una asignación compatible con el tipo de datos de la variable.
- CONSTANT
- Especifica que la variable de SQL tiene un valor fijo que no se puede cambiar. Una variable de SQL que se defina mediante CONSTANT no puede utilizarse como destino de una operación de asignación. El valor fijo debe ser compatible con la asignación al tipo de datos de la variable.
- NULL
- Especifica NULL como valor por omisión para la variable de SQL.
- constante
- Especifica una constante como valor por omisión para la variable de SQL. Si tipo-datos4 especifica un tipo incorporado CURSOR o un nombre-tipo-cursor, no puede especificarse la constante (SQLSTATE 42601).
- constructor-valor-cursor
- Un constructor-valor-cursor especifica la sentencia-select asociada con la variable de SQL. La asignación de un constructor-valor-cursor a una variable de cursor define el cursor
subyacente de esa variable de cursor.
- (declaración-parámetro-cursor, ...)
- Especifica los parámetros de entrada del cursor, incluido el nombre y el tipo de datos de cada parámetro. Sólo se pueden especificar parámetros de entrada con nombre si la sentencia-select también está especificada en el constructor-valor-cursor (SQLSTATE 428HU).
- nombre-parámetro
- Asigna un nombre al parámetro de cursor que se debe utilizar como variable de SQL dentro de la sentencia-select. El nombre no puede ser igual que ningún otro nombre de parámetro del cursor. Los nombres deben elegirse también evitando nombres de columna que se puedan utilizar en la sentencia-select, ya que los nombres de columna se resuelven antes que los nombres de parámetro.
- tipo-datos5
- Especifica el tipo de datos del parámetro de cursor utilizado dentro de una sentencia-select. No se pueden especificar tipos estructurados ni tipos de referencia (SQLSTATE
429BB).
- tipo-incorporado
- Especifica un tipo de datos incorporado. Para obtener una descripción más completa de cada tipo de datos incorporado, consulte "CREATE TABLE". Los tipos incorporados BOOLEAN y CURSOR no pueden especificarse (SQLSTATE 429BB).
- tipo-datos-no-fila-anclados
- Identifica otro objeto que se utiliza para determinar el tipo de datos del parámetro de cursor. El tipo de datos del objeto de anclaje tiene las mismas limitaciones que se aplican cuando se especifica el tipo de datos directamente.
- ANCHOR DATA TYPE TO
- Indica que se utiliza un tipo de datos anclados para especificar el
tipo de datos.
- nombre-variable
- Identifica una variable de SQL local, un parámetro SQL o una variable global. El tipo de datos de la variable a la que se hace referencia se utiliza como tipo de datos para el parámetro de cursor.
- nombre-tabla.nombre-columna
- Identifica un nombre de columna de una tabla o vista existente. El tipo de datos de la columna se utiliza como tipo de datos para el parámetro de cursor.
- nombre-tipo-diferenciado
- Especifica el nombre de un tipo diferenciado. Si se especifica el nombre-tipo-diferenciado sin un nombre de esquema, el tipo diferenciado se resuelve buscando en los esquemas de la vía de acceso de SQL.
- posibilidad de mantenimiento
- Especifica si se impedirá que el cursor se cierre como consecuencia de una
operación de confirmación. Consulte el apartado "DECLARE CURSOR" para obtener más información. El valor por omisión es WITHOUT HOLD.
- WITHOUT HOLD
- No impide que el cursor se cierre como consecuencia de una operación de confirmación.
- WITH HOLD
- Mantiene recursos en varias unidades de trabajo. Impide que el cursor se cierre como consecuencia de una operación de confirmación.
- sentencia-select
- Especifica la sentencia SELECT del cursor. Consulte el apartado "sentencia-select" para obtener más información. Si se incluye una declaración-parámetro-cursor en el constructor-valor-cursor, la sentencia-select no debe incluir ninguna variable de SQL local ni parámetros de SQL de rutina (SQLSTATE 42704).
- nombre-sentencia
- Especifica la sentencia-select preparada del cursor. Consulte el apartado "PREPARE" para obtener una explicación de las sentencias preparadas. La variable del cursor de destino no debe tener un tipo de datos que sea un tipo de cursor definido por el usuario con tipo firme (SQLSTATE 428HU). No se deben especificar parámetros de entrada con nombre en el constructor-valor-cursor si se especifica un nombre-sentencia (SQLSTATE 428HU).
- RESULT_SET_LOCATOR VARYING
- Especifica el tipo de datos de una variable localizadora de conjuntos de resultados.
- declaración-condición
- Declara el nombre de una condición con un valor SQLSTATE opcional asociado.
- nombre-condición
- Especifica el nombre de la condición. El nombre de la condición debe ser exclusivo dentro de la sentencia compuesta en la que está declarada, salvo en el caso de las declaraciones de las sentencias compuestas anidadas dentro de dicha sentencia compuesta (SQLSTATE 42734). Sólo se puede hacer referencia al nombre de una condición dentro de la sentencia compuesta en la que está declarada, incluidas las sentencias compuestas anidadas dentro de dicha sentencia compuesta (SQLSTATE 42737).
- CONDITION FOR SQLSTATE VALUEconstante-serie
- Especifica el SQLSTATE que está asociado a la condición. La constante de serie debe especificarse como cinco caracteres entre comillas simples, y la clase de SQLSTATE (los dos primeros caracteres) no deben ser '00'. Si esta cláusula no se especifica, la condición no tendrá un valor SQLSTATE asociado.
- declaración-sentencia
- Declara una lista de uno o más nombres que son locales en la sentencia compuesta. Cada nombre en nombre-sentencia no debe ser el mismo que cualquier otro nombre de sentencia declarado en la misma sentencia compuesta.
- declaración-códigos-retorno
- Declara las variables especiales llamadas SQLSTATE y SQLCODE, que se establecen automáticamente en el valor que se devuelve tras procesar una sentencia de SQL. Las variables SQLSTATE y SQLCODE sólo se pueden declarar en la sentencia compuesta más externa del cuerpo del procedimiento de SQL cuando existen sentencias de SQL compuesto (compilado) anidadas, por ejemplo, en un cuerpo de procedimiento de SQL. Estas variables sólo se pueden declarar una vez para cada procedimiento de SQL.
- sentencia-declare-cursor
- Declara un cursor incorporado en el cuerpo del procedimiento. Las variables de los tipos de datos de cursor definidos por el usuario se declaran con las sentencias declaración-variable-SQL.
Todos los cursores declarados han de tener un nombre exclusivo dentro de la sentencia compuesta en la que están declarados, salvo en el caso de las declaraciones de las sentencias compuestas anidadas dentro de dicha sentencia compuesta (SQLSTATE 42734). Sólo se puede hacer referencia al cursor dentro de la sentencia compuesta en la que está declarado, incluidas las sentencias compuestas anidadas dentro de dicha sentencia compuesta (SQLSTATE 34000).
Utilice una sentencia OPEN para abrir el cursor, y una sentencia FETCH para leer filas utilizando el cursor. Para que el procedimiento SQL devuelva conjuntos de resultados a la aplicación cliente, el cursor se debe declarar utilizando la cláusula WITH RETURN. El ejemplo siguiente devuelve un conjunto de resultados a la aplicación cliente:CREATE PROCEDURE RESULT_SET() LANGUAGE SQL RESULT SETS 1 BEGIN DECLARE C1 CURSOR WITH RETURN FOR SELECT id, name, dept, job FROM staff; OPEN C1; ENDNota: Para procesar conjuntos de resultados debe grabar la aplicación cliente utilizando una de las interfaces de programación de aplicaciones siguientes: Interfaz a nivel de llamada de Db2 (Interfaz a nivel de llamada de Db2 ), Open Database Connectivity (ODBC), Java™ Database Connectivity (JDBC) o SQL incorporado para Java (SQLJ).
Para obtener más información acerca de la declaración de un cursor, consulte el apartado "DECLARE CURSOR".
- declaración-procedimiento
- Declara un procedimiento que es local respecto a la sentencia compuesta.
La definición de un procedimiento local no incluye la especificación de ninguna de las opciones posibles en una sentencia
CREATE PROCEDURE (SQL)
. Las opciones tienen los mismos valores por omisión que tendrían para una sentenciaCREATE PROCEDURE (SQL)
con la excepción de MODIFIES SQL DATA. El nivel de acceso a datos para el procedimiento queda determinado de forma automática en el nivel mínimo necesario para procesar el cuerpo del procedimiento de SQL.- nombre-procedimiento
- Define los nombres de un procedimiento local. El nombre debe especificarse sin ninguna calificación (SQLSTATE 42601). La signatura de procedimiento, que consta del nombre-procedimiento y el número de parámetros declarados, debe ser exclusiva dentro de la sentencia compuesta actual. Las sentencias compuestas externas en las que está anidada la sentencia compuesta actual no pueden contener un procedimiento con el mismo nombre.
- declaración-parámetro
- Especifica los parámetros del procedimiento local. Consulte
CREATE PROCEDURE (SQL)
para obtener una descripción de los elementos de sintaxis. El tipo de datos de parámetro puede ser un tipo de datos declarado localmente en el ámbito de la sentencia compuesta actual. - cuerpo-procedimiento-SQL
- Especifica la sentencia de SQL que forma el cuerpo del procedimiento de SQL. Los nombres a los que se hace referencia en el cuerpo-procedimiento-SQL pueden hacer referencia a objetos declarados (como variables declaradas, tipos de datos y procedimientos) que se han declarado anteriormente y que están en el ámbito de la sentencia compuesta en la que se declara el procedimiento local.
- declaración-manejador
- Especifica un manejador y un conjunto de una o varias
sentencias-procedimiento-SQL que debe ejecutarse cuando se produzca
una condición de excepción o de terminación en la sentencia compuesta.
sentencia-procedimiento-SQL es una sentencia que
se ejecuta cuando el manejador de condiciones recibe el control.
Se dice que un manejador está activo mientras dura la ejecución del conjunto de sentencias-procedimiento-SQL que sigue al conjunto de declaraciones-manejador dentro de la sentencia compuesta en la que se ha declarado el manejador, incluidas las sentencias compuestas anidadas.
Existen tres tipos de manejadores de condiciones:
- CONTINUE
- Tras la invocación satisfactoria del manejador de condiciones, el control pasa a la sentencia de SQL que sigue a continuación de la sentencia que provocó la condición de excepción. Si el error que causó la excepción es una sentencia FOR, IF, CASE, WHILE o REPEAT (pero no una sentencia de procedimiento SQL incluida dentro de una de aquéllas), el control pasa a la sentencia que sigue a continuación de END FOR, END IF, END CASE, END WHILE o END REPEAT.
- EXIT
- Tras la invocación satisfactoria del manejador de condiciones, el control se transfiere al final de la sentencia compuesta donde se declaró el manejador de condiciones.
- UNDO
- Antes de invocar el manejador de condiciones, se retrotraen los cambios de SQL que se hicieron en la sentencia compuesta. Tras la invocación satisfactoria del manejador de condiciones, el control se transfiere al final de la sentencia compuesta donde se declaró el manejador de condiciones. Si se especifica UNDO, la sentencia compuesta en la que se declara el manejador de condiciones debe ser ATOMIC.
Las condiciones que dan lugar a la activación del manejador de condiciones se definen en la declaración-manejador-condiciones, tal como se indica a continuación:
- valor-condición-específica
- Especifica que el manejador es un
manejador de condiciones
específicas.
- SQLSTATE VALUEconstante-serie
- Especifica un SQLSTATE para el cual se invoca el manejador de condiciones. Los dos primeros caracteres del valor SQLSTATE no deben ser '00'.
- nombre-condición
- Especifica una condición para la cual se invoca el manejador de condiciones. El nombre de la condición debe estar definido previamente en una declaración de condición o debe identificar una condición que existe en el servidor actual.
- valor-condición-general
- Especifica que el manejador es un
manejador de condiciones
generales.
- SQLEXCEPTION
- Especifica que el manejador se invoca cuando se produce una condición de excepción. Un valor SQLSTATE representa una condición de excepción cuyos dos primeros caracteres no son '00', '01' o '02'.
- SQLWARNING
- Especifica que el manejador se invoca cuando se produce una condición de aviso. Un valor SQLSTATE representa una condición de aviso cuyos dos primeros caracteres son '01'.
- NOT FOUND
- Especifica que el manejador de condiciones se invoca cuando se produce una condición de "no encontrado" (NOT FOUND). Un valor SQLSTATE representa una condición NOT FOUND cuyos dos primeros caracteres son '02'.
- sentencia-procedimiento-SQL
- Especifica la sentencia de
procedimiento de SQL.
- etiqueta
- Especifica una etiqueta para la sentencia de procedimiento de SQL. La etiqueta debe ser exclusiva dentro de una lista de sentencias de procedimiento de SQL, incluidas las sentencias compuestas anidadas dentro de la lista. Tenga en cuenta que las sentencias compuestas que no están anidadas pueden utilizar la misma etiqueta. Varias sentencias de control de SQL admiten la especificación de una lista de sentencias de procedimiento de SQL.
- sentencia-SQL
- Todas las sentencias de SQL ejecutables, excepto:
- ALTER
- CONNECT
- CREATE
- DESCRIBE
- DISCONNECT
- DROP
- FLUSH EVENT MONITOR
- FREE LOCATOR
- GRANT
- REFRESH TABLE
- RELEASE (sólo conexión)
- RENAME TABLE
- RENAME TABLESPACE
- REVOKE
- SET CONNECTION
- SET INTEGRITY
- SET PASSTHRU
- SET SERVER OPTION
- TRANSFER OWNERSHIP
Las sentencias ejecutables siguientes no están soportadas en sentencias independientes de SQL compuesto (compilado), pero sí están soportadas en sentencias de SQL compuesto (compilado) utilizadas en una función de SQL, un procedimiento de SQL o un activador:- CREATE de un índice, tabla o vista
- DECLARE GLOBAL TEMPORARY TABLE
- DROP de un índice, tabla o vista
- GRANT
- ROLLBACK
Las sentencias siguientes, que son sentencias no ejecutables, están soportadas en sentencias de SQL compuesto (compilado):- ALLOCATE CURSOR
- ASSOCIATE LOCATORS
Normas
- Las sentencias compuestas definidas como ATOMIC no se pueden anidar.
- Las normas siguientes son aplicables a la declaración de un manejador de
condiciones:
- Una declaración de manejador de condiciones no puede contener el mismo nombre-condición o valor SQLSTATE más de una vez y no puede contener un valor SQLSTATE y un nombre-condición que representen el mismo valor SQLSTATE.
- Cuando se declaran dos o más manejadores de
condiciones en una sentencia compuesta:
- Dos declaraciones de manejador no pueden especificar la misma categoría de condición general (SQLEXCEPTION, SQLWARNING, NOT FOUND).
- Dos declaraciones de manejador de condiciones no pueden especificar la misma condición específica, ya sea como un valor SQLSTATE o como un nombre-condición que represente el mismo valor.
- Un manejador de condiciones se activa cuando es el manejador
más apropiado para una condición de excepción o terminación. El manejador más adecuado se determina
basándose en las consideraciones siguientes:
- El ámbito de una declaración de manejador H es la lista de la sentencia-procedimiento-SQL que sigue a las declaraciones de manejador contenidas dentro de la sentencia compuesta en la que aparece H. Esto significa que el ámbito de H no incluye las sentencias contenidas en el cuerpo del manejador de condiciones H, lo que implica que un manejador de condiciones no puede manejar las condiciones que se producen dentro de su propio cuerpo. De forma similar, en el caso de dos manejadores cualesquiera, H1 y H2, declarados en la misma sentencia compuesta, H1 no manejará las condiciones que se produzcan en el cuerpo de H2 y H2 no manejará las condiciones que se produzcan en el cuerpo de H1.
- Un manejador de condiciones para un valor-condición-específica o un valor-condición-general C declarado en un ámbito interno tiene prioridad respecto a cualquier otro manejador de condiciones para C declarado en un ámbito de inclusión.
- Cuando, en el mismo ámbito, se declaran un manejador de condiciones específico para una condición C y un manejador de condiciones general que también manejaría C, el manejador de condiciones específico tiene prioridad respecto al manejador de condiciones general.
- Cuando se declaran un manejador de una condición de módulo que no tiene un valor SQLSTATE asociado y un manejador de SQLSTATE 45000 en el mismo ámbito, el primero tiene prioridad sobre el segundo.
- La referencia a variables o a parámetros del tipo de datos XML en los procedimientos de SQL después de que se haya producido una operación de confirmación o de retrotracción, sin que primero se hayan asignado valores nuevos a estas variables, no tiene soporte (SQLSTATE 560CE).
- Utilización de tipos de datos anclados: Un tipo de datos anclado no puede hacer referencia a los siguientes objetos (SQLSTATE 428HS): un apodo, una tabla con tipo, una vista con tipo, una vista estadística asociada con un índice basado en la expresión, una tabla temporal declarada, una definición de fila asociada con un cursor de tipo débil, un objeto con una página de códigos o una clasificación que es diferente de la página de códigos de la base de datos o la asignación de base de datos.
- Si se utilizan marcadores de parámetros con nombre en una sentencia de SQL compuesto (compilado) que se prepara o ejecuta dinámicamente, el nombre de cada marcador de parámetro debe ser exclusivo (SQLSTATE 42997).
Notas
- Asignaciones de XML: la
asignación a parámetros y variables de tipo de datos
XML se realiza por referencia.
Los parámetros del tipo de datos XML de una sentencia CALL se pasan a un procedimiento de SQL por referencia. Cuando los valores XML se pasan por referencia, los árboles de nodos de entrada se utilizan directamente desde el argumento XML. Este uso directo mantiene todas las propiedades, incluyendo el orden de documentos, las identidades de nodo originales y todas las propiedades padre.
Ejemplos
- Ejemplo 1: Una sentencia compuestas autónoma simple que da salida a la palabra 'Hello':
SET SERVEROUTPUT ON; BEGIN CALL DBMS_OUTPUT.PUT_LINE ( 'Hello' ); END - Ejemplo 2: Una sentencia compuestas autónoma simple que cuenta el número de registros de
staffy da salida al resultado:SET SERVEROUTPUT ON; BEGIN DECLARE v_numRecords INTEGER DEFAULT 1; SELECT COUNT(*) INTO v_numRecords FROM staff; CALL DBMS_OUTPUT.PUT_LINE (v_numRecords); END - Ejemplo 3: Cree un procedimiento con una sentencia SQL compuesto (compilada) que realice las siguientes acciones:
- Declara variables de SQL
- Declara un cursor para que proporcione el salario de los empleados de un departamento determinado de acuerdo con un parámetro IN. En la sentencia SELECT, convierte de DECIMAL a DOUBLE el tipo de datos de la columna salary (salario).
- Declara un manejador de condiciones EXIT para la condición NOT FOUND (fin
de archivo), que asigna el valor '6666' al parámetro de salida
medianSalary(salario medio) - Selecciona el número de empleados del departamento especificado y lo
coloca en la variable de SQL
numRecords - Lee filas desde el cursor en un bucle WHILE hasta llegar al 50% + 1 de los empleados
- Devuelve el salario medio
CREATE PROCEDURE DEPT_MEDIAN (IN deptNumber SMALLINT, OUT medianSalary DOUBLE) LANGUAGE SQL BEGIN DECLARE v_numRecords INTEGER DEFAULT 1; DECLARE v_counter INTEGER DEFAULT 0; DECLARE c1 CURSOR FOR SELECT CAST(salary AS DOUBLE) FROM staff WHERE DEPT = deptNumber ORDER BY salary; DECLARE EXIT HANDLER FOR NOT FOUND SET medianSalary = 6666; -- inicializar parámetro de salida SET medianSalary = 0; SELECT COUNT(*) INTO v_numRecords FROM staff WHERE DEPT = deptNumber; OPEN c1; WHILE v_counter < (v_numRecords / 2 + 1) DO FETCH c1 INTO medianSalary; SET v_counter = v_counter + 1; END WHILE; CLOSE c1; END - Ejemplo 4: El siguiente ejemplo ilustra el flujo de ejecución en un
caso hipotético donde se ha activado un manejador UNDO desde otra condición como resultado de RESIGNAL:
CREATE PROCEDURE A() LANGUAGE SQL CS1: BEGIN ATOMIC DECLARE C CONDITION FOR SQLSTATE '12345'; DECLARE D CONDITION FOR SQLSTATE '23456'; DECLARE UNDO HANDLER FOR C H1: BEGIN -- Realizar retrotracción tras error, realizar limpieza final y salir -- de procedimiento A. -- ... -- Cuando este manejador finaliza, la ejecución continúa después -- de la sentencia compuesta CS1; el procedimiento A terminará. END; -- Realizar aquí algún trabajo ... CS2: BEGIN DECLARE CONTINUE HANDLER FOR D H2: BEGIN -- Realizar recuperación local y reenviar la condición de -- error al manejador externo para su proceso -- adicional. -- ... RESIGNAL C; -- activará el manejador UNDO H1; la ejecución -- NO VOLVERÁ aquí. Los cursores locales -- declarados en H2 y CS2 se cerrarán. END; -- Realizar aquí algún trabajo adicional ... -- Simular la generación de la condición D por parte de alguna -- sentencia de SQL en la sentencia compuesta CS2: SIGNAL D; -- activará H2 END; END
