MySQL DECLARE… Instrução CONDIÇÃO

Resumo : neste tutorial, você aprenderá como usar DECLARE ... CONDITIONa 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 SQLSTATEvalor para representar uma condição. No entanto, o código de erro SQLSTATEpode não estar claro.

Para resolver esse problema, o MySQL fornece a DECLARE ... CONDITIONinstrução para declarar uma condição de erro nomeada que associa um nome a uma condição.

Aqui está a sintaxe da DECLARE ... CONDITIONinstruçã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 DECLAREpalavra-chave ( codition_name).
  • Segundo, forneça o valor da condição ( condition_value) após a FORpalavra-chave. O valor da condição pode ser um código de erro do MySQL ou um SQLSTATEvalor.

Observe que você não deve usar código de erro 0ou SQLSTATEvalor 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 HANDLERpara 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 ... CONDITIONpara criar um procedimento armazenado que recupera dados de uma tabela especificada pelo tbl_nameparâ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_tableassociada 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_tablee 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_nameparâ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 employeestabela 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 employeestabela.

No entanto, se chamarmos o procedimento armazenado que recupera dados da abctabela 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 ... CONDITIONpara associar um nome a uma condição especificada por um código de erro ou SQLSTATEvalor do MySQL para tornar o código do procedimento armazenado mais legível e expressivo.

Deixe um comentário

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