Instrução MySQL SIGNAL

Resumo : neste tutorial, você aprenderá como usar a SIGNAL instrução MySQL para gerar condições de erro em procedimentos armazenados.

Introdução à instrução MySQL SIGNAL

A SIGNALinstrução MySQL permite gerar uma exceção dentro de um programa armazenado, incluindo um procedimento armazenado, uma função armazenada , um gatilho ou um evento .

Aqui está a sintaxe da SIGNALinstrução MySQL:

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

Nesta sintaxe:

valor_condição

O valor da condição indica o valor do erro que você deseja aumentar. Pode ser:

  • Um SQLSTATEvalor. O SQLSTATEvalor não deve começar com '00'porque não indica um erro. Para sinalizar um SQLSTATEvalor genérico, você usa '45000', que indica um "unhandled user-defined exception".
  • Uma condição nomeada é definida com DECLARE ... CONDITIONinstrução.

sinal_informação_item

A SIGNALinstrução pode incluir uma SETcláusula que contém vários itens de sinal. Cada item de sinal está no seguinte formato:

condition_information_item_name = simple_value_specificationLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Você usa vírgulas para separar vários itens de sinal.

Exemplo de instrução MySQL SIGNAL

Vamos configurar um novo banco de dados chamado hr com uma employeestabela para demonstração:

-- Create a sample database and switch to it
CREATE DATABASE IF NOT EXISTS hr;
USE hr;

-- Create a sample employee table
CREATE TABLE IF NOT EXISTS employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10,2)
);

-- Insert some sample data
INSERT INTO employees (id, name, salary) 
VALUES
    (1, 'John Doe', 50000),
    (2, 'Jane Smith', 75000),
    (3, 'Bob Johnson', 90000);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

O exemplo a seguir cria um procedimento armazenado que atualiza o salário de um funcionário especificado por um número de funcionário e gera um erro se o funcionário não for encontrado ou se o salário for negativo:

DELIMITER //

CREATE PROCEDURE update_salary(
	IN p_employee_id INT,
    IN p_salary DECIMAL
)
BEGIN 
	DECLARE employee_count INT;
    
    -- check if employee exists
    SELECT COUNT(*) INTO employee_count 
    FROM employees
    WHERE id = p_employee_id;
    
    IF employee_count = 0 THEN
		SIGNAL SQLSTATE '45000'
		SET MESSAGE_TEXT = 'Employee not found';
    END IF;
    
    -- validate salary
    IF p_salary < 0 THEN
		SIGNAL SQLSTATE '45000'
		SET MESSAGE_TEXT = 'Salary cannot be negative';
    END IF;
    
    -- if every is fine, update the salary
    UPDATE employees
    SET salary = p_salary
    WHERE id = p_employee_id;    

END //

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

Como funciona.

Primeiro, declare a employee_countvariável e conte o número de funcionários com base no p_employee_idparâmetro:

    DECLARE employee_count INT;
    
    -- check if employee exists
    SELECT COUNT(*) INTO employee_count 
    FROM employees
    WHERE id = p_employee_id;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Segundo, gere um erro se employee_countfor zero usando a SIGNALinstrução:

    IF employee_count = 0 THEN
		SIGNAL SQLSTATE '45000'
		SET MESSAGE_TEXT = 'Employee not found';
    END IF;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Terceiro, levante outro erro se o salário for negativo:

    IF p_salary < 0 THEN
		SIGNAL SQLSTATE '45000'
		SET MESSAGE_TEXT = 'Salary cannot be negative';
    END IF;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Por fim, atualize o salário caso o funcionário exista e o salário seja positivo:

    UPDATE employees
    SET salary = p_salary
    WHERE id = p_employee_id;   Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

A instrução a seguir chama o update_salaryprocedimento e gera um erro funcionário não encontrado:

CALL update_salary(1, 7000);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Saída:

ERROR 1644 (45000): Employee not foundLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Se você usar um salário negativo, receberá o seguinte erro:

CALL update_salary(1, -7000);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Erro:

ERROR 1644 (45000): Salary cannot be negativeLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Resumo

  • Use SIGNALa instrução MySQL para gerar condições de erro em procedimentos armazenados.

Deixe um comentário

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