Instrução DECLARE HANDLER

A instrução DECLARE HANDLER cria uma rotina de tratamento de erro para manipular exceções.

SINTAXE

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.

Se o processamento do código da rotina de tratamento for concluído sem emitir exceções adicionais não manipuladas, a execução do código normal será retomada conforme a seguir:
  • Para rotinas de tratamento EXIT, a próxima instrução processada será a primeira instrução após o escopo da rotina de tratamento.
  • Para rotinas de tratamento CONTINUE, será a primeira instrução diretamente contida após aquela que produziu a exceção.

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.

Exemplo

-- 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;
Conceitos relacionados
Visão Geral do ESQL
Tarefas relacionadas
Desenvolvendo ESQL
Referências relacionadas
Instrução RESIGNAL
Diagramas de Sintaxe: Tipos Disponíveis
instruções ESQL
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback
Direitos Autorais IBM Corporation 1999, 2006 Última Atualização: 1 Sep 2006
ak20700_