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 SIGNAL
instruçã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 SIGNAL
instruçã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
SQLSTATE
valor. OSQLSTATE
valor não deve começar com'00'
porque não indica um erro. Para sinalizar umSQLSTATE
valor genérico, você usa'45000'
, que indica um"unhandled user-defined exception"
. - Uma condição nomeada é definida com
DECLARE ... CONDITION
instrução.
sinal_informação_item
A SIGNAL
instrução pode incluir uma SET
cláusula que contém vários itens de sinal. Cada item de sinal está no seguinte formato:
condition_information_item_name = simple_value_specification
Linguagem 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 employees
tabela 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_count
variável e conte o número de funcionários com base no p_employee_id
parâ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_count
for zero usando a SIGNAL
instruçã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_salary
procedimento 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 found
Linguagem 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 negative
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Resumo
- Use
SIGNAL
a instrução MySQL para gerar condições de erro em procedimentos armazenados.