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

Leer el esquema de sintaxisOmitir el esquema de sintaxis visualetiqueta:BEGIN NOT ATOMICATOMICdeclaración-tipo;declaración-variable-SQLdeclaración-condicióndeclaración-códigos-retorno;declaración-sentencia;sentencia-DECLARE-CURSOR;declaración-procedimiento;declaración-manejador;sentencia-procedimiento-SQL;END etiqueta
declaración-tipo
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualDECLARE TYPEnombre-tiponombre-tipoTYPE AS definición-tipo-matrizdefinición-tipo-distintodefinición-tipo-fila
definición-tipo-matriz
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualtipo-datos1ARRAY[ 2147483647constante-enterotipo-datos2 ]
tipo-datos1
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualtipo-incorporadotipo-datos-ancladosnombre-tipo-fila
tipo-incorporado
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)( entero,0, entero)FLOAT(53)( entero)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( enteroOCTETSCODEUNITS32)VARCHARCHARACTERCHARVARYING( enteroOCTETSCODEUNITS32)FOR BIT DATA1CLOBCHARACTERCHARLARGE OBJECT(1M)( enteroKMGOCTETSCODEUNITS32)GRAPHIC(1)( enteroCODEUNITS16CODEUNITS32)VARGRAPHIC( enteroCODEUNITS16CODEUNITS32)DBCLOB(1M)( enteroKMGCODEUNITS16CODEUNITS32)BINARY(1)( entero)VARBINARYBINARY VARYING(entero)BLOBBINARY LARGE OBJECT(1M)( enteroKMG)DATETIMETIMESTAMP(6)(entero)XMLBOOLEANCURSOR
tipo-datos-anclados
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualANCHORDATA TYPE TO nombre-variablenombre-tabla.nombre-columnaROWOFnombre-tablanombre-vistanombre-variable-cursor
tipo-datos-2
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualINTEGERINTVARCHARCHARACTERCHARVARYING(entero)tipo-datos-no-fila-anclados
tipo-datos-no-fila-anclados
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualANCHORDATA TYPE TO nombre-variablenombre-tabla.nombre-columna
definición-tipo-diferenciado
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualtipo-datos-fuenteWITH WEAK TYPE RULES NOT NULL CHECK(nombre-comprobación)
tipo-datos-fuente
Leer el esquema de sintaxisOmitir el esquema de sintaxis visual tipo-incorporadotipo-datos-no-fila-anclados
definición-tipo-fila
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualROW (,nombre-campotipo-datos3)tipo-datos-fila-anclados
tipo3-datos
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualtipo-incorporadotipo-datos-no-fila-ancladosnombre-tipo-distinto
tipo-datos-fila-anclados
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualANCHORDATA TYPE TO nombre-variableROWOFnombre-tablanombre-vistanombre-variable-cursor
declaración-variable-SQL
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualDECLARE,nombre-variable-SQLtipo4-datosDEFAULT NULLCONSTANT NULLDEFAULTCONSTANTconstante(constructor-valor-cursor)2RESULT_SET_LOCATORVARYING
tipo4-datos
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualtipo-incorporadotipo-datos-ancladosnombre-tipo-matriz3nombre-tipo-cursornombre-tipo-diferenciadonombre-tipo-fila4
constructor-valor-cursor
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualCURSOR (,declaración-parámetro-cursor) posibilidad-mantenimiento FOR sentencia-selectnombre-sentencia5
declaración-parámetro-cursor
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualnombre-parámetrotipo-datos5
tipo-datos5
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualtipo-incorporadotipo-datos-no-fila-ancladosnombre-tipo-diferenciado
posibilidad de mantenimiento
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualWITHOUT HOLDWITH HOLD
declaración-condición
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualDECLAREnombre-condiciónCONDITION FORSQLSTATEVALUEconstante-serie
declaración-sentencia
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualDECLARE ,nombre-sentencia STATEMENT
declaración-códigos-retorno
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualDECLARESQLSTATECHARACTER(5)CHAR(5)DEFAULT '00000'DEFAULTconstante-serieSQLCODEINTEGERINTDEFAULT 0DEFAULTconstante-entera
declaración-procedimiento
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualDECLARE PROCEDUREnombre-procedimientonombre-procedimientoPROCEDURE ( ,declaración-parámetro )cuerpo-procedimiento-SQL
cuerpo-procedimiento-SQL
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualsentencia-procedimiento-SQL
declaración-manejador-condiciones
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualDECLARECONTINUEEXITUNDOHANDLERFOR valor-condición-específicavalor-condición-general sentencia-procedimiento-SQL
valor-condición-específica
Leer el esquema de sintaxisOmitir el esquema de sintaxis visual,SQLSTATEVALUEconstante-serienombre-condición
valor-condición-general
Leer el esquema de sintaxisOmitir el esquema de sintaxis visual,SQLEXCEPTIONSQLWARNINGNOT FOUND
sentencia-procedimiento-SQL
Leer el esquema de sintaxisOmitir el esquema de sintaxis visualetiqueta:sentencia-SQL
Notas:
  • 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.
Si el tipo de cursor de la variable de cursor no es de tipo firme que utiliza un tipo de fila con nombre, el tipo de datos de nombre-variable-SQL es un tipo de fila sin nombre.
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;
   END

Nota: 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 sentencia CREATE 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
La sentencia ROLLBACK tampoco está soportada en cualquier sentencia anidada invocada dentro de la sentencia independiente de SQL compuesto (compilado).
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.
      Si se produce una condición de excepción para la que no existe un manejador adecuado, el procedimiento de SQL que contiene la sentencia anómala finaliza con una condición de excepción no manejada. Si se produce una condición de finalización para la que no existe un manejador de condiciones adecuado, la ejecución continuará con la siguiente sentencia de SQL.
  • 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 staff y 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:
    1. Declara variables de SQL
    2. 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).
    3. 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)
    4. Selecciona el número de empleados del departamento especificado y lo coloca en la variable de SQL numRecords
    5. Lee filas desde el cursor en un bucle WHILE hasta llegar al 50% + 1 de los empleados
    6. 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