Como lidar com condições de SQL

Você pode ter o seu olhar programa em SQLSTATE

após a execução de cada instrução SQL. Existem várias possibilidades para o que você pode querer fazer a seguir. O que você faz com o conhecimento que você ganha?

  • Se você encontrar um código de classe 00, você provavelmente não quer fazer nada. Você quer que a execução para proceder como originalmente planejado.

  • Se você encontrar um código de classe 01 ou 02, você pode querer realizar uma ação especial. Se você espera que o # 147-Aviso # 148- ou # 147 não encontrado # 148- indicação, você provavelmente vai querer deixar que a execução prossiga. Se você não esperava qualquer um destes códigos de classe, você provavelmente vai querer ter ramo de execução para um procedimento que é projetado especificamente para lidar com o inesperado, mas não totalmente inesperada, avisando ou não encontrados resultado.

  • Se você receber qualquer outro código de classe, algo está errado. Você deve ramificar a um procedimento de tratamento de exceção. Qual o procedimento que você escolher para desviar para depende do conteúdo dos três personagens da subclasse, bem como os dois personagens de classe SQLSTATE. Se várias exceções diferentes são possíveis, deve haver um procedimento de tratamento de exceção para cada um, porque diferentes exceções muitas vezes exigem respostas diferentes.

    Você pode ser capaz de corrigir alguns erros ou encontrar soluções alternativas. Outros erros podem ser fatal- ninguém vai morrer, mas você pode acabar por ter de encerrar o aplicativo.

declarações de manipulador

Você pode colocar um manipulador de condição dentro de uma instrução composta. Para criar um manipulador de condição, você deve primeiro declarar a condição de que ele vai lidar. A condição declarada pode ser algum tipo de exceção, ou pode ser apenas algo que é verdade. Aqui estão algumas condições possíveis.

CondiçãoDescrição
SQLSTATE VALUE'xxyyy 'Específico SQLSTATE valor
SQLEXCEPTIONSQLSTATE classe diferente de 00, 01, ou 02
SQLWARNINGSQLSTATE classe 01
NÃO ENCONTRADOSQLSTATE classe 02

O que se segue é um exemplo de uma declaração condição:

'23000' -END BEGINDECLARE constraint_violation CONDITIONFOR SQLSTATE VALOR -

Este exemplo não é realístico, porque normalmente a instrução SQL que podem causar a condição de ocorrer - bem como o manipulador que seria usada se não ocorreu a condição - seria também ser incluída dentro do BEGIN # 133-END estrutura.

ações de manipulador e efeitos manipulador

Se ocorrer uma condição que invoca um manipulador, a ação especificada pelo manipulador executa. Esta ação é uma instrução SQL, que pode ser uma instrução composta. Se a ação manipulador for concluída com êxito, então o efeito manipulador executa. O que se segue é uma lista dos três efeitos possíveis do manipulador:

  • CONTINUAR: Continuar a execução imediatamente após a instrução que causou o manipulador a ser chamado.

  • SAÍDA: Continuar a execução após a instrução composto que contém o manipulador.

  • DESFAZER: Desfazer o trabalho das declarações anteriores da instrução composta e, em seguida, continuar a execução após a instrução que contém o manipulador.

Se o manipulador pode corrigir qualquer problema invocado o manipulador, então o CONTINUAR efeito pode ser apropriado. o SAÍDA efeito pode ser apropriado se o manipulador não corrigir o problema, mas as alterações feitas para o comando composto não precisa ser desfeita. o DESFAZER efeito é apropriado se você quiser retornar o banco de dados para o estado em que estava antes da instrução composta iniciou a execução.

Considere o seguinte exemplo:

BEGIN ATOMICDECLARE constraint_violation CONDITIONFOR SQLSTATE VALOR '23000' -DECLARE UNDO HANDLERFOR constraint_violationRESIGNAL -INSERT INTO alunos (StudentID, Fname, Lname) VALUES (: sid,: sfname,: slname) -INSERT INTO roster (ClassID, Classe, StudentID) VALUES (: cid,: cname,: sid) -END -

Se um dos dois INSERIR declarações causa uma violação de restrição, como a tentativa de adicionar um registro com uma chave primária que duplica uma chave primária já em cima da mesa, SQLSTATE assume um valor de '23000', definindo assim o constraint_violation condição para um valor verdadeiro.

Esta ação faz com que o manipulador DESFAZER quaisquer alterações que foram feitas para quaisquer tabelas por qualquer INSERIR comando. o RESIGNAL transferências de instrução de controle de volta para o procedimento que chamou o procedimento atualmente em execução.

Se ambos INSERIR declarações executar com êxito, a execução continua com a instrução após a FIM palavra-chave.

o ATOMIC palavra-chave é obrigatória sempre que o efeito de um manipulador é DESFAZER. Este não é o caso para os manipuladores, cujo efeito é tanto CONTINUAR ou SAÍDA.

menu