La sentencia DECLARE HANDLER crea un manejador de errores para manejar las excepciones.
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 más abajo) y se procesa la sentencia del gestor.
Puesto que la sentencia del gestor 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 gestores pueden contener gestores de excepciones que se produzcan dentro del gestor mismo.
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.
-- 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;