WebSphere Message Broker, Versión 8.0.0.5 Sistemas operativos: AIX, HP-Itanium, Linux, Solaris, Windows, z/OS

Consulte la información sobre la última versión del producto en IBM Integration Bus, Versión 9.0

Sentencia DECLARE HANDLER

La sentencia DECLARE HANDLER crea un manejador de errores para manejar las excepciones.

Sintaxis

Leer el esquema de sintaxisOmitir el esquema de sintaxis visual
>>-DECLARE--+-CONTINUE-+--HANDLER FOR--| Estado |--Stmt--------><
            '-EXIT-----'                                  

Estado

   .-<<-- , --<<--------------------------------------------------.   
   V                                                              |   
|------SQLSTATE--+-+-------+--' Texto '-----------------------+---+--|
                 | '-VALUE-'                                  |       
                 '---LIKE--' Texto '--+-------------------+---'       
                                      '-ESCAPE--' Texto '-'           

Puede declarar gestores tanto en ámbitos declarados explícitamente (BEGIN...END) como en ámbitos declarados implícitamente (por ejemplo, la cláusula ELSE de una sentencia IF). Sin embargo, todas las declaraciones de manejadores deben estar juntas al principio del ámbito, antes de cualquier otra sentencia.

Si no se producen excepciones, la presencia de gestores no afecta al comportamiento ni al rendimiento de un programa SQL. Si se produce una excepción, WebSphere Message Broker compara el estado SQL de la excepción con los estados SQL asociados a cualquier gestor relevante, hasta que o bien la excepción deja el nodo (como lo haría si no hubiera gestores) o bien se encuentra un gestor que coincide. Dentro de cualquier ámbito, los gestores se buscan en el orden en que se han declarado; es decir, del primero al último. Los ámbitos se buscan desde los más internos a los más externos.

Los valores de estado SQL proporcionados en sentencias DECLARE... HANDLER... pueden compararse directamente con el estado SQL de la excepción o pueden compararse utilizando caracteres comodín. Para comparar los valores de estado directamente, especifique VALUE o no especifique ningún operador de condición. Para efectuar una comparación con comodín, utilice los caracteres de subrayado y de porcentaje para representar comodines de un solo o varios caracteres, respectivamente, y especifique el operador LIKE. El método de comodines permite manejar todas las excepciones de un tipo general sin tener que listarlas exhaustivamente.

Si se encuentra un gestor que coincide, se actualiza SQLSTATE y otros registros especiales (según las normas descritas en esta sección) y se procesa la sentencia del gestor.

Puesto que la sentencia del manejador debe ser una sola sentencia, normalmente es una sentencia compuesta (como BEGIN...END) que contiene varias sentencias más. No hay ningún comportamiento especial asociado a estas sentencias internas y no hay limitaciones especiales. Por ejemplo, pueden incluir RETURN, ITERATE o LEAVE; éstos afectan a las construcciones de bucles y a las rutinas que contienen, de la misma manera que si estuvieran contenidas en el ámbito mismo.

Los manejadores pueden contener manejadores de excepciones que se produzcan dentro del propio manejador.

Si el proceso del código del manejador se completa sin generar excepciones no manejadas adicionales, se reanuda la ejecución del código normal, del modo siguiente:
  • Para gestores EXIT, la siguiente sentencia procesada es la primera sentencia después del ámbito del gestor.
  • Para gestores CONTINUE, es la primera sentencia contenida directamente después de la que ha generado la excepción.

Cada gestor tiene sus propios registros especiales SQLCODE, SQLSTATE, SQLNATIVEERROR y SQLERRORTEXT. Éstos entran en el ámbito y sus valores se establecen justo antes de que se ejecute la primera sentencia del gestor. Siguen siendo válidos hasta que se ha ejecutado la última sentencia del gestor. Puesto que los valores SQLSTATE no se pasan de un gestor a otro, los gestores pueden escribirse de forma independiente.

Los gestores absorben las excepciones, impidiendo que lleguen al nodo de entrada y hagan que la transacción se confirme en lugar de que se restituya. Un gestor puede utilizar una sentencia RESIGNAL o THROW para impedirlo.

Consulte Función SQLSTATE para obtener una lista de los SQLSTATES válidos que se pueden utilizar en un HANDLER.

Ejemplo 1

El ejemplo siguiente muestra el uso correcto de una USER EXCEPTION y del paso de SQLCODE, SQLSTATE, SQLNATIVEERROR y SQLERRORTEXT de la excepción al manejador. El ejemplo también utiliza SQLSTATE para captar la excepción específica:
DECLARE retryCount INTEGER 0;
DECLARE afterCount INTEGER 0;

WHILE retryCount <= 10 DO
  DECLARE EXIT HANDLER FOR SQLSTATE VALUE 'U11222'
  BEGIN	
    /* Esta sección muestra cómo pasar datos al HANDLER en los
       registros especiales de SQL */
    SET OutputRoot.XMLNSC.Top.WHILE.mySQLCODE = SQLCODE;
    SET OutputRoot.XMLNSC.Top.WHILE.mySQLSTATE = SQLSTATE;
    SET OutputRoot.XMLNSC.Top.WHILE.mySQLNATIVEERROR = SQLNATIVEERROR;
    SET OutputRoot.XMLNSC.Top.WHILE.mySQLERRORTEXT = SQLERRORTEXT;

    SET retryCount = retryCount + 1;

    /* Si estamos en EXIT HANDLER, el control se pasa otra vez a la
       sentencia WHILE */
  END;

  /* En un escenario real, ésta podría ser una sentencia PROPAGATE y podría generar
     la excepción un nodo que se encontrara 'en sentido descendente'. En ese caso, el HANDLER
     generalmente podría tratar más excepciones, por ejemplo utilizando LIKE '%' */
  THROW USER EXCEPTION VALUES( -1, 'U11222', 42, 'error text' );
          
  /* Ésta es la siguiente sentencia que se ejecuta si es un CONTINUE HANDLER */
  SET afterCount = afterCount + 1;
          
END WHILE;
        
SET OutputRoot.XMLNSC.Top.WHILE.retryCount = retryCount;
SET OutputRoot.XMLNSC.Top.WHILE.afterCount = afterCount;   

Con EXIT (como arriba) la salida es:
<Top>
  <WHILE>
    <mySQLCODE>-1</mySQLCODE>
    <mySQLSTATE>U11222</mySQLSTATE>
    <mySQLNATIVEERROR>42</mySQLNATIVEERROR>
    <mySQLERRORTEXT>error text</mySQLERRORTEXT>
    <retryCount>11</retryCOUNT>
    <afterCount>0</afterCOUNT>
  </WHILE>
</Top>

Si se cambia el HANDLER a CONTINUE (DECLARE CONTINUE HANDLER FOR SQLSTATE VALUE
'U11222') la salida es:
<Top>
  <WHILE>
    <mySQLCODE>-1</mySQLCODE>
    <mySQLSTATE>U11222</mySQLSTATE>
    <mySQLNATIVEERROR>42</mySQLNATIVEERROR>
    <mySQLERRORTEXT>error text</mySQLERRORTEXT>
    <retryCount>11</retryCOUNT>
    <afterCount>11</afterCOUNT>
  </WHILE>
</Top>
Puede ver la diferencia en afterCount en el mensaje de salida.

Ejemplo 2

-- Eliminar las tablas para que se puedan volver a crear con la definición más reciente.
-- Si el programa no se ha ejecutado nunca anteriormente, se producirán errores
-- porque no puede eliminar tablas que no existen. Ignoramos estos errores.
  BEGIN
    DECLARE CONTINUE HANDLER FOR SQLSTATE LIKE'%' BEGIN END;

    PASSTHRU 'DROP TABLE Shop.Customers' TO Database.DSN1;
    PASSTHRU 'DROP TABLE Shop.Invoices'  TO Database.DSN1;
    PASSTHRU 'DROP TABLE Shop.Sales'     TO Database.DSN1;
    PASSTHRU 'DROP TABLE Shop.Parts'     TO Database.DSN1;
  END;
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Comentarios

Copyright IBM Corporation 1999, 2014Copyright IBM Corporation 1999, 2014.

        
        Última actualización:
        
        Última actualización: 2015-02-28 17:00:01


Tema de referenciaTema de referencia | Versión 8.0.0.5 | ak20700_