A instrução DECLARE HANDLER cria uma rotina de tratamento de erro para manipular exceções.
Você pode declarar rotinas de tratamento em escopos explicitamente declarados (BEGIN...END) e escopos implicitamente declarados (por exemplo, a cláusula ELSE de uma instrução IF). Entretanto, todas as declarações de rotina de tratamento devem ficar juntas no início do escopo, antes de quaisquer outras instâncias.
Se não houver exceções, a presença de rotinas de tratamento não afetará o comportamento ou desempenho de um programa SQL. Se ocorrer uma exceção, o WebSphere Message Broker comparará o estado SQL da exceção com os estados SQL associados a quaisquer rotinas de tratamento relevantes, até que a exceção deixe o nó (exatamente como seria se não houvesse rotinas de tratamento) ou uma rotina de tratamento correspondente seja localizada. Dentro de um escopo, as rotinas de tratamento são procuradas na ordem em que são declaradas; ou seja, da primeira à última. Os escopos são procurados do interno para o externo.
Os valores de estado SQL fornecidos nas instruções DECLARE... HANDLER... podem ser comparados diretamente com o estado SQL da exceção e podem ser comparados utilizando caracteres curinga. Para comparar os valores de estado diretamente, especifique VALUE ou nenhum operador de condição. Para fazer uma comparação de curingas, utilize os caracteres de sublinhado e porcentagem para representar curingas de caracteres únicos e múltiplos, respectivamente, e especifique o operador LIKE. O método de curinga permite que todas as exceções de um tipo geral sejam manipuladas sem a necessidade de listá-las exaustivamente.
Se uma rotina de tratamento correspondente for localizada, o SQLSTATE e outros registros especiais serão atualizados (de acordo com as regras descritas a seguir) e a instrução da rotina de tratamento será processada.
Como a instrução da rotina de tratamento deve ser uma instrução única, geralmente ela é uma instrução composta (como BEGIN...END) contendo várias outras instruções. Não há nenhum comportamento especial associado a essas instruções internas e não há restrições especiais. Elas podem incluir, por exemplo, RETURN, ITERATE ou LEAVE, que afetam as rotinas que as contêm e as construções de loop da mesma maneira como se estivessem contidas no próprio escopo.
As rotinas de tratamento podem conter rotinas de tratamento para exceções que ocorrem dentro da própria rotina de tratamento.
Cada rotina de tratamento possui seus próprios registros especiais SQLCODE, SQLSTATE, SQLNATIVEERROR e SQLERRORTEXT. Eles entram no escopo e seus valores são configurados logo antes da execução da primeira instrução da rotina de tratamento. Eles permanecem válidos até que a última instrução da rotina de tratamento tenha sido executada. Como não há transporte de valores SQLSTATE de uma rotina de tratamento para outra, as rotinas de tratamento podem ser gravadas independentemente.
As rotinas de tratamento absorvem as exceções, impedindo que elas cheguem ao nó input e, portanto, fazendo com que a transação seja confirmada em vez ter o rollback efetuado. Uma rotina de tratamento pode utilizar uma instrução RESIGNAL ou THROW para evitar isso.
-- Eliminar as tabelas para que possam ser recriadas com a definição mais recente. -- Se o programa nunca tiver sido executado antes, ocorrerão erros porque -- não é possível eliminar tabelas que não existem. Ignore-os. 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;