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 代码的复用性和执行效率,适用于复杂的业务逻辑处理。