Resumo : neste tutorial, você aprenderá como usar DECLARE ... CONDITION
a instrução MySQL para declarar uma condição de erro nomeada.
Introdução ao MySQL DECLARE… instrução CONDITION
Uma condição é um aviso ou erro que ocorre em um procedimento armazenado. MySQL usa um código de erro ou um SQLSTATE
valor para representar uma condição. No entanto, o código de erro SQLSTATE
pode não estar claro.
Para resolver esse problema, o MySQL fornece a DECLARE ... CONDITION
instrução para declarar uma condição de erro nomeada que associa um nome a uma condição.
Aqui está a sintaxe da DECLARE ... CONDITION
instrução:
DECLARE condition_name CONDITION FOR condition_value
condition_value: {
mysql_error_code
| SQLSTATE [VALUE] sqlstate_value
}
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe:
- Primeiro, especifique o nome da condição após a
DECLARE
palavra-chave (codition_name
). - Segundo, forneça o valor da condição (
condition_value
) após aFOR
palavra-chave. O valor da condição pode ser um código de erro do MySQL ou umSQLSTATE
valor.
Observe que você não deve usar código de erro 0
ou SQLSTATE
valor do MySQL que comece com '00'
porque eles indicam sucesso em vez de um aviso ou condição de erro.
As condições nomeadas tornam o código de procedimentos da loja mais claro e fácil de manter.
Por exemplo, o seguinte declara um HANDLER
para o código de erro do MySQL 1051
:
DECLARE CONTINUE HANDLER FOR 1051
BEGIN
-- body of handler
END;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Mas 1015 não diz explicitamente o seu significado. Para entendê-la, é preciso pesquisar e descobrir o seu significado, que é “tabela desconhecida”.
Ao usar uma condição nomeada, o código expressa sua intenção de forma muito clara. Por exemplo:
DECLARE unknown_table CONDITION FOR 1051;
DECLARE CONTINUE HANDLER FOR unknown_table
BEGIN
-- body of handler
END;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
MySQL DECLARE…CONDITION exemplo
O exemplo a seguir mostra como usar DECLARE ... CONDITION
para criar um procedimento armazenado que recupera dados de uma tabela especificada pelo tbl_name
parâmetro:
DELIMITER $$
CREATE PROCEDURE GetData(
IN tbl_name VARCHAR(255)
)
BEGIN
DECLARE unknown_table CONDITION FOR 1051;
DECLARE EXIT HANDLER FOR unknown_table
BEGIN
SHOW ERRORS;
END;
SET @sql_query = CONCAT('SELECT * FROM ', tbl_name);
PREPARE stmt FROM @sql_query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Como funciona.
Primeiro, declare uma condição nomeada unknown_table
associada ao código de erro do MySQL 1051
:
DECLARE unknown_table CONDITION FOR 1051;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, declare um manipulador de saída que use a condição nomeada unknown_table
e mostre os erros se o procedimento tentar selecionar em uma tabela que não existe:
DECLARE EXIT HANDLER FOR unknown_table
BEGIN
SHOW ERRORS;
END;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Terceiro, construa uma instrução preparada que recupere todas as linhas e colunas da tabela especificada pelo tbl_name
parâmetro:
SET @sql_query = CONCAT('SELECT * FROM ', tbl_name);
PREPARE stmt FROM @sql_query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O exemplo a seguir usa o GetData()
procedimento armazenado para recuperar dados da employees
tabela no banco de dados de amostra :
CALL GetData('employees');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Ele retorna todas as linhas e colunas da employees
tabela.
No entanto, se chamarmos o procedimento armazenado que recupera dados da abc
tabela que não existe, o procedimento armazenado retornará um erro:
CALL GetData('abc');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Erro:
+-------+------+-----------------------------------------+
| Level | Code | Message |
+-------+------+-----------------------------------------+
| Error | 1146 | Table 'classicmodels.abc' doesn't exist |
+-------+------+-----------------------------------------+
1 row in set (0.01 sec)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Resumo
- Use o MySQL
DECLARE ... CONDITION
para associar um nome a uma condição especificada por um código de erro ouSQLSTATE
valor do MySQL para tornar o código do procedimento armazenado mais legível e expressivo.