Resumo : neste tutorial, você aprenderá como usar a RESIGNAL
instrução MySQL para gerar novamente exceções em programas armazenados.
Introdução à instrução MySQL RESIGNAL
A instrução MySQL RESIGNAL
permite 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 RESIGNAL
instruçã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 RESIGNAL
instrução com uma SET
clá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 RESIGNAL
declaraçã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 RESIGNAL
instrução para gerar novamente a exceção. Se ocorrer algum SQLEXCEPTION
, a RESGINAL
instruçã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 RESIGNAL
instrução para gerar novamente a exceção, mas com novas informações, definindo the MYSQL_ERRNO
como 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
RESIGNAL
instrução para gerar novamente uma exceção.