Resumo : neste tutorial, você aprenderá como usar o manipulador MySQL para lidar com erros ou avisos encontrados em procedimentos armazenados.
No MySQL, condições referem-se a erros, avisos ou casos excepcionais que requerem tratamento adequado.
Quando surge uma condição durante a execução de um procedimento armazenado, você deve tratá-la adequadamente, como sair ou continuar o bloco de código atual.
Para lidar com uma condição, você declara um manipulador usando a DECLARE ... HANDLER
instrução.
Introdução ao MySQL DECLARE… instrução HANDLER
Aqui está a sintaxe básica da DECLARE...HANDLER
instrução:
DECLARE { EXIT | CONTINUE } HANDLER
FOR condition_value [, condition_value] ...
statement
Linguagem de código: PHP ( php )
Nesta sintaxe:
DECLARE { EXIT | CONTINUE } HANDLER
: declara um manipulador, instruindo se ele deve sair ou continuar o procedimento armazenado envolvente quando ocorrer uma condição especificada.EXIT
: O procedimento armazenado será encerrado.CONTINUE
: O procedimento armazenado continuará a execução.
FOR condition_value [, condition_value] ...
: especifica as condições que ativam o manipulador e você pode especificar diversas condições separando-as com vírgulas.statement
: esta instrução ou bloco de instruções é executado quando o procedimento armazenado encontra uma das condições especificadas.
Pode condition_value
ser um dos seguintes:
mysql_error_code
– Este é um número inteiro que indica um código de erro do MySQL, como1051
.SQLWARNING
– Este é um atalho para a classe deSQLSTATE
valores que começa com'01'
.NOT FOUND
– Este é um atalho para a classe deSQLSTATE
valores que começa com'02'
.SQLEXCEPTION
– Este é um atalho para a classe deSQLSTATE
valores que não começam com'00'
,'01'
, ou'02'
.SQLSTATE [VALUE] sqlstate_value
– Esta é uma string que indica umSQLSTATE
valor, como'42S01'
significa “Tabela desconhecida”.
SQLSTATE
é um caractere de cinco caracteres que fornece informações sobre o resultado de uma operação SQL. Um SQLSTATE
consiste em duas partes:
- Código da Classe (dois primeiros caracteres): Indica a categoria geral do erro.
- Código da Subclasse (Próximos três caracteres): Fornece informações mais específicas sobre o erro dentro da categoria geral.
Por exemplo, um código SQLSTATE ’42S02′ indica uma tabela ausente, onde ’42’ é o código de classe para erro de sintaxe ou violação de regra de acesso e ‘S02’ é o código de subclasse que indica que a tabela não foi encontrada.
MySQL DECLARE… Exemplo de HANDLER
Primeiro, crie uma tabela chamada users
:
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(50) NOT NULL
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, defina um procedimento armazenado que insira um novo usuário na users
tabela:
DELIMITER //
CREATE PROCEDURE insert_user(
IN p_username VARCHAR(50),
IN p_email VARCHAR(50)
)
BEGIN
-- SQLSTATE for unique constraint violation
DECLARE EXIT HANDLER FOR SQLSTATE '23000'
BEGIN
-- Handler actions when a duplicate username is detected
SELECT 'Error: Duplicate username. Please choose a different username.' AS Message;
END;
-- Attempt to insert the user into the table
INSERT INTO users (username, email) VALUES (p_username, p_email);
-- If the insertion was successful, display a success message
SELECT 'User inserted successfully' AS Message;
END //
DELIMITER ;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Como funciona.
O insert_user()
procedimento armazenado aceita dois parâmetros nome de usuário e email.
No procedimento armazenado, declare um manipulador de saída que será ativado quando ocorrer uma violação de restrição exclusiva , indicada pelo SQLSTATE ‘23000’:
DECLARE EXIT HANDLER FOR SQLSTATE '23000'
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Quando ocorre o erro, o procedimento armazenado retorna a seguinte mensagem e encerra a execução imediatamente:
SELECT 'Error: Duplicate username. Please choose a different username.' AS Message;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Insira uma nova linha na users
tabela, se ocorrer uma violação de restrição exclusiva, o código dentro do BEGIN ... END
bloco do manipulador será executado:
INSERT INTO users (username, email) VALUES (p_username, p_email);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Se a inserção for bem-sucedida, a seguinte linha de código será executada:
SELECT 'User inserted successfully' AS Message;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Terceiro, insira uma nova linha na users
tabela chamando o insert_user
procedimento armazenado:
CALL insert_user('jane','[email protected]');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Ele retorna a seguinte mensagem:
+----------------------------+
| Message |
+----------------------------+
| User inserted successfully |
+----------------------------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
Linguagem de código: texto simples ( texto simples )
Se você executar a instrução novamente, retornará o seguinte erro:
+----------------------------------------------------------------+
| Message |
+----------------------------------------------------------------+
| Error: Duplicate username. Please choose a different username. |
+----------------------------------------------------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
Linguagem de código: texto simples ( texto simples )
Resumo
- Use manipuladores MySQL para lidar com condições, incluindo avisos e erros em procedimentos armazenados.
- Use a
DECLARE...HANDLER
instrução para declarar um manipulador.