MySQL 存储过程是一组为了完成特定任务而预先编译好的 SQL 语句集合,存储在数据库中,用户可以通过指定存储过程的名称并给出参数(如果该存储过程带有参数)来执行它。以下是关于 MySQL 存储过程的详细教程:
DELIMITER //
CREATE PROCEDURE procedure_name([parameter_list])
BEGIN
-- 存储过程体
SQL_statements;
END //
DELIMITER ;
在上述语法中:
DELIMITER
:用来改变语句分隔符,因为存储过程中可能包含多个 SQL 语句,每个语句通常以分号 ;
结尾,为了让 MySQL 正确识别存储过程的开始和结束,需要临时改变分隔符。CREATE PROCEDURE
:用于创建存储过程。procedure_name
:存储过程的名称。parameter_list
:可选参数列表,参数可以有三种类型:IN
(输入参数)、OUT
(输出参数)、INOUT
(既可以输入也可以输出)。BEGIN
和 END
:用于界定存储过程体的开始和结束。下面创建一个简单的存储过程,用于查询 employees
表中的所有记录:
DELIMITER //
CREATE PROCEDURE GetAllEmployees()
BEGIN
SELECT * FROM employees;
END //
DELIMITER ;
使用 CALL
语句来调用存储过程。
CALL procedure_name([parameter_values]);
对于上面创建的 GetAllEmployees
存储过程,调用方式如下:
CALL GetAllEmployees();
输入参数用于向存储过程传递值。以下是一个带有输入参数的存储过程示例,用于根据员工 ID 查询员工信息:
DELIMITER //
CREATE PROCEDURE GetEmployeeById(IN emp_id INT)
BEGIN
SELECT * FROM employees WHERE id = emp_id;
END //
DELIMITER ;
调用该存储过程:
CALL GetEmployeeById(1);
输出参数用于从存储过程中返回值。以下是一个带有输出参数的存储过程示例,用于返回员工表中的记录总数:
DELIMITER //
CREATE PROCEDURE GetEmployeeCount(OUT emp_count INT)
BEGIN
SELECT COUNT(*) INTO emp_count FROM employees;
END //
DELIMITER ;
调用该存储过程并获取输出参数的值:
SET @count = 0;
CALL GetEmployeeCount(@count);
SELECT @count;
输入输出参数既可以接收输入值,也可以返回修改后的值。以下是一个带有输入输出参数的存储过程示例,用于将输入的数值加倍:
DELIMITER //
CREATE PROCEDURE DoubleValue(INOUT num INT)
BEGIN
SET num = num * 2;
END //
DELIMITER ;
调用该存储过程:
SET @value = 5;
CALL DoubleValue(@value);
SELECT @value;
使用 DROP PROCEDURE
语句删除存储过程。
DROP PROCEDURE IF EXISTS procedure_name;
例如,删除 GetAllEmployees
存储过程:
DROP PROCEDURE IF EXISTS GetAllEmployees;
IF
语句IF
语句用于根据条件执行不同的 SQL 语句。以下是一个使用 IF
语句的存储过程示例,根据员工的薪水判断其薪资等级:
DELIMITER //
CREATE PROCEDURE GetSalaryGrade(IN emp_salary DECIMAL(10, 2), OUT grade VARCHAR(10))
BEGIN
IF emp_salary > 5000 THEN
SET grade = 'High';
ELSEIF emp_salary > 2000 THEN
SET grade = 'Medium';
ELSE
SET grade = 'Low';
END IF;
END //
DELIMITER ;
调用该存储过程:
SET @salary = 3000;
CALL GetSalaryGrade(@salary, @grade);
SELECT @grade;
WHILE
循环WHILE
循环用于重复执行一组 SQL 语句,直到满足指定的条件为止。以下是一个使用 WHILE
循环的存储过程示例,计算从 1 到 10 的整数之和:
DELIMITER //
CREATE PROCEDURE CalculateSum(OUT total INT)
BEGIN
DECLARE i INT DEFAULT 1;
SET total = 0;
WHILE i <= 10 DO
SET total = total + i;
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
调用该存储过程:
CALL CalculateSum(@sum);
SELECT @sum;
通过以上步骤,你可以掌握 MySQL 存储过程的基本创建、调用、参数使用以及控制结构的使用方法。存储过程可以提高 SQL 代码的复用性和执行效率,适用于复杂的业务逻辑处理。