Declaração RESIGNAL do MySQL

Resumo : neste tutorial, você aprenderá como usar a RESIGNALinstrução MySQL para gerar novamente exceções em programas armazenados.

Introdução à instrução MySQL RESIGNAL

A instrução MySQL RESIGNALpermite manipular e gerar novamente uma condição de erro em programas armazenados, incluindo procedimentos armazenados, funções armazenadas , gatilhos e eventos .

Para levantar novamente a condição de erro sozinho, você usa a RESIGNALinstrução:

RESIGNAL;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Para gerar novamente uma exceção com novas informações de sinal, você usa a RESIGNALinstrução com uma SETcláusula:

RESIGNAL 
SET signal_information_item 
[, signal_information_item] ...;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Para aumentar novamente um novo valor de condição com novas informações de sinal:

RESIGNAL condition_value
[SET signal_information_item 
[, signal_information_item] ...];Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Exemplos de instruções MySQL RESIGNAL

Vamos explorar alguns exemplos para aprender como usar a RESIGNALdeclaração de forma eficaz.

1) Usando MySQL RESIGNAL para gerar novamente a mesma exceção

O exemplo a seguir define um procedimento armazenado que elimina uma tabela inexistente XYZ:

DELIMITER //

CREATE PROCEDURE DropTableXYZ()
BEGIN
  -- reraise the error
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    RESIGNAL;
  END;
  
  -- drop a table that doesn't exist
  DROP TABLE XYZ;
END//

DELIMITER ;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Dentro da seção do manipulador, usamos a RESIGNALinstrução para gerar novamente a exceção. Se ocorrer algum SQLEXCEPTION, a RESGINALinstrução levanta novamente a mesma exceção.

Por exemplo:

CALL DropTableXYZ();Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Saída:

ERROR 1051 (42S02): Unknown table 'classicmodels.xyz'Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

2) Usando a instrução RESIGNAL com novas informações de sinal

O exemplo a seguir usa a RESIGNALinstrução para gerar novamente a exceção, mas com novas informações, definindo the MYSQL_ERRNOcomo 5:

DROP PROCEDURE DropTableXYZ;

DELIMITER //

CREATE PROCEDURE DropTableXYZ()
BEGIN
  -- reraise the error
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    RESIGNAL SET MYSQL_ERRNO = 5;
  END;
  
  -- drop a table that doesn't exist
  DROP TABLE XYZ;
END//

DELIMITER ;

CALL DropTableXYZ();Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Se você chamar o DropTableXYZ()procedimento armazenado, verá um número de erro diferente:

CALL DropTableXYZ();Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Saída:

ERROR 5 (42S02): Unknown table 'classicmodels.xyz'Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Observe que o erro original é 1051 e não 5.

3) Re-rasing exceção com novo valor de condição e informações de sinal:

O exemplo a seguir modifica o procedimento armazenado para gerar novamente uma exceção com uma nova condição e informações de sinal:

DELIMITER //

CREATE PROCEDURE DropTableXYZ()
BEGIN
  -- reraise the error
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    RESIGNAL SQLSTATE '45000' SET MYSQL_ERRNO = 5;
  END;
  
  -- drop a table that doesn't exist
  DROP TABLE XYZ;
END//

DELIMITER ;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Chamar o procedimento armazenado emitirá um erro diferente:

CALL DropTableXYZ();Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Erro:

ERROR 5 (45000): Unknown table 'classicmodels.xyz'Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Resumo

  • Use a RESIGNALinstrução para gerar novamente uma exceção.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *