Sentencia RESIGNAL

La sentencia RESIGNAL se utiliza en un manejador de condiciones para retransmitir la condición que ha activado el manejador o para generar una condición alternativa a fin de poderse procesar a un nivel más alto. Genera una condición de excepción, aviso o de no encontrada junto con un texto de mensaje opcional.

Sintaxis

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visualetiqueta:RESIGNALSQLSTATEVALUEconstante de cadena sqlstatenombre-variable-SQLNombre del parámetro SQLSQL-nombre-condicióninformación-señal

información de la señal:

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visualSETMESSAGE_TEXT=expresión de cadena de diagnóstico

Descripción

etiqueta
Inicio del cambioEspecifica la etiqueta para la sentencia RESIGNAL. Un nombre de etiqueta no puede ser el mismo que el nombre de rutina, el nombre de activador avanzado u otra etiqueta dentro del mismo ámbito. Para obtener información adicional, consulte Referencias a etiquetas SQL en SQL PL.fin del cambio
SQLSTATE VALUE
Especifica el SQLSTATE que se devolverá. Puede utilizarse cualquier valor válido de SQLSTATE. Debe ser una cadena de caracteres constante con exactamente cinco caracteres que sigan las reglas para valores SQLSTATE:
  • Cada carácter debe ser del conjunto de dígitos (del «0» al «9») o una letra mayúscula sin acento (de la «A» a la «Z»).
  • La clase SQLSTATE (los dos primeros caracteres) no puede ser «00» porque representa una finalización correcta.

Si el SQLSTATE no se ajusta a estas reglas, se produce un error.

constante-serie-sqlstate
Una cadena de caracteres constante con una longitud real de cinco bytes que es un valor SQLSTATE válido.
Nombre de variable SQL o nombre de parámetro SQL
Especifica una variable SQL o un parámetro SQL que está definido para la rutina.
Nombre de variable SQL
Especifica una variable SQL que se declara dentro de la sentencia compuesta que contiene la sentencia RESIGNAL o dentro de una sentencia compuesta en la que se anida dicha sentencia compuesta. El nombre de la variable SQL debe definirse como tipo de datos CHAR o VARCHAR con una longitud real de cinco bytes, no debe ser nulo y debe contener un valor SQLSTATE válido.
SQL_nombre_parámetro
Especifica un parámetro SQL que está definido para la rutina que contiene el valor SQLSTATE. El parámetro SQL debe definirse como tipo de datos CHAR o VARCHAR con una longitud real de cinco bytes, no debe ser nulo y debe contener un valor SQLSTATE válido.
SQL-nombre-condición
Especifica el nombre de la condición que se devolverá. SQL-nombre-de-condición debe declararse dentro de la instrucción-compuesta que contiene la instrucción RESIGNAL, o dentro de una instrucción compuesta en la que esa instrucción compuesta está anidada.
SET MESSAGE_TEXT
Especifica una serie de caracteres que describe el error o aviso. La cadena se devuelve en el campo SQLERRMC de SQLCA o con la instrucción GET DIAGNOSTICS.
expresión-serie-diagnóstico
Una expresión con un tipo de datos CHAR o VARCHAR que devuelve una cadena de caracteres de hasta 1000 bytes que describe la condición de error o advertencia. Para obtener información sobre cómo obtener el texto completo del mensaje, consulte la declaración OBTENER DIAGNÓSTICOS.

Notas

Aunque en la instrucción RESIGNAL se puede utilizar cualquier valor SQLSTATE válido, los programadores deben definir nuevos SQLSTATEs basados en rangos reservados para aplicaciones. Esta práctica evita el uso involuntario de un valor SQLSTATE que podría ser definido por el administrador de la base de datos en una versión futura.

Si el SQLSTATE o la condición indican que se ha señalado una excepción (clase SQLSTATE distinta de '01' o '02'):

  • Si existe un controlador de condiciones en la misma sentencia compuesta que la sentencia RESIGNAL, y la sentencia compuesta contiene un controlador de condiciones para SQLEXCEPTION o el SQLSTATE o condición especificados, la excepción se gestiona y el control se transfiere a ese controlador de condiciones.
  • Si la sentencia compuesta está anidada y una sentencia compuesta de nivel externo tiene un controlador de condiciones para SQLEXCEPTION o el SQLSTATE o la condición especificados, la excepción se gestiona y el control se transfiere a ese controlador de condiciones.
  • De lo contrario, la excepción no se gestiona y el control vuelve inmediatamente al final de la sentencia compuesta.

Si un SQLSTATE o una condición indica que se ha señalado una advertencia o una condición no encontrada:

  • Si existe un controlador de condición en la misma sentencia compuesta que la sentencia RESIGNAL, y la sentencia compuesta contiene un controlador de condición para SQLWARNING, NOT FOUND, o el SQLSTATE o condición especificados, la condición de advertencia o no encontrada se maneja y el control se transfiere a ese controlador de condición.
  • Si la sentencia compuesta está anidada y una sentencia compuesta de nivel externo contiene un controlador de condición para SQLWARNING, NOT FOUND o el SQLSTATE o la condición especificados, se gestiona la condición de advertencia o de no encontrado y el control se devuelve a ese controlador de condición.
  • De lo contrario, la advertencia no se gestiona y el procesamiento continúa con el siguiente extracto.

Consideraciones para el área de diagnóstico : La sentencia RESIGNAL podría modificar el contenido del área de diagnóstico actual. Si se especifica un SQLSTATE o un nombre de condición como parte de la instrucción RESIGNAL, la instrucción RESIGNAL comienza con un área de diagnóstico despejada y establece el RETURNED_SQLSTATE para reflejar el SQLSTATE o el nombre de condición especificados. Si se especifica el texto del mensaje, al elemento MESSAGE_TEXT del área de condición se le asigna el valor especificado. DB2_RETURNED_SQLCODE está establecido en +438 o -438, lo que corresponde al SQLSTATE o nombre de condición especificado.

Procesamiento de una sentencia RESIGNAL : Si la sentencia RESIGNAL se especifica sin una cláusula SQLSTATE o un nombre de condición, la rutina SQL resigna la misma condición que invocó al controlador y el SQLCODE no se modifica.

Cuando se emite una sentencia RESIGNAL y se especifica un SQLSTATE o un nombre de condición, el SQLCODE se basa en el valor SQLSTATE de la siguiente manera:
  • Si la clase SQLSTATE especificada es '01' o '02', se señalará una advertencia o no se encontrará y el SQLCODE se establecerá en +438.
  • De lo contrario, se devuelve una excepción y el SQLCODE se establece en -438.

ejemplos

El siguiente ejemplo detecta un error de división por cero. La sentencia IF utiliza una sentencia SIGNAL para invocar el controlador de condición de desbordamiento. El controlador de condiciones utiliza una instrucción RESIGNAL para devolver un SQLSTATE diferente a la aplicación cliente.

CREATE PROCEDURE divide (IN numerator INTEGER,
        IN denominator INTEGER,
        OUT divide_result INTEGER)
  LANGUAGE SQL
  CONTAINS SQL
  BEGIN
   DECLARE overflow CONDITION for SQLSTATE '22003';
   DECLARE CONTINUE HANDLER FOR overflow
     RESIGNAL SQLSTATE '22375';
   IF denominator = 0 THEN
     SIGNAL overflow;
   ELSE
     SET divide_result = numerator / denominator;
   END IF;
  END