MySQL存储过程详解
一、存储过程
1 什么是存储过程?
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,它经编译后存储在数据库中,用户可以通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它,在业务逻辑复杂和数据操作频繁的场景中,存储过程能够显著提高数据处理效率和代码的可维护性。
2 存储过程的优点
封装性和可重用性:存储过程可以将复杂的业务逻辑封装起来,简化应用开发工作,同时可以在多个地方重复调用,减少代码冗余。
减少网络交互:由于存储过程在数据库服务器端执行,客户端只需发送一次调用请求,减少了网络传输量。
提高执行效率:存储过程在首次执行时会进行编译并生成执行计划,后续调用时直接复用执行计划,提高了执行速度。
增强安全性:通过存储过程可以限制对数据库表的直接访问权限,从而增强数据的安全性。
二、创建和调用存储过程
1 创建存储过程
创建存储过程使用CREATE PROCEDURE
语句,语法如下:
DELIMITER $$ CREATE PROCEDURE procedure_name ([parameters]) BEGIN -SQL statements END$$ DELIMITER ;
创建一个查询员工信息的存储过程:
DELIMITER $$ CREATE PROCEDURE get_employee_info() BEGIN SELECT * FROM employees; END$$ DELIMITER ;
2 调用存储过程
调用存储过程使用CALL
语句,语法如下:
CALL procedure_name([parameters]);
调用上面创建的存储过程:
CALL get_employee_info();
3 删除存储过程
删除存储过程使用DROP PROCEDURE
IF EXISTS 语句,语法如下:
DROP PROCEDURE IF EXISTS procedure_name;
删除上面创建的存储过程:
DROP PROCEDURE IF EXISTS get_employee_info;
三、变量在存储过程中的使用
1 局部变量
局部变量的作用域仅限于存储过程内部,声明局部变量使用DECLARE
语句,语法如下:
DECLARE var_name data_type [DEFAULT value];
DECLARE emp_id INT DEFAULT 1001;
赋值和使用局部变量:
SET emp_id = 1002; SELECT emp_id;
2 用户变量
用户变量以@
开头,作用域为当前会话,声明和使用用户变量不需要提前声明,直接使用即可:
SET @var_name = value; SELECT @var_name;
SET @my_var = 'Hello, World!'; SELECT @my_var;
3 系统变量
系统变量分为全局变量和会话变量,查看系统变量使用SHOW VARIABLES
语句:
SHOW GLOBAL VARIABLES; -查看全局变量 SHOW SESSION VARIABLES; -查看会话变量
修改系统变量使用SET
语句:
SET GLOBAL autocommit = 0; SET SESSION sort_buffer_size = 50000;
四、流程控制语句在存储过程中的使用
1 IF判断语句
IF语句用于条件判断,语法如下:
IF condition THEN -statements [ELSEIF other_condition THEN -other_statements] [ELSE -else_statements] END IF;
CREATE PROCEDURE grade_level(IN score INT) BEGIN DECLARE result VARCHAR(10); IF score >= 85 THEN SET result = '优秀'; ELSEIF score >= 60 THEN SET result = '及格'; ELSE SET result = '不及格'; END IF; SELECT result AS Grade; END$$
2 CASE语句
CASE语句用于多重条件判断,语法如下:
CASE WHEN condition1 THEN result1 [WHEN condition2 THEN result2] ... ELSE default_result END CASE;
根据传入的月份判定季节:
CREATE PROCEDURE season(IN month INT) BEGIN DECLARE result VARCHAR(10); CASE WHEN month BETWEEN 1 AND 3 THEN SET result = '春季'; WHEN month BETWEEN 4 AND 6 THEN SET result = '夏季'; WHEN month BETWEEN 7 AND 9 THEN SET result = '秋季'; WHEN month BETWEEN 10 AND 12 THEN SET result = '冬季'; ELSE SET result = '未知季节'; END CASE; SELECT result AS Season; END$$
3 循环语句
WHILE循环
WHILE循环用于反复执行某段代码,直到条件不满足为止,语法如下:
WHILE condition DO -statements END WHILE;
计算1到100的和。
CREATE PROCEDURE calculate_sum() BEGIN DECLARE counter INT DEFAULT 1; DECLARE sum INT DEFAULT 0; WHILE counter <= 100 DO SET sum = sum + counter; SET counter = counter + 1; END WHILE; SELECT sum AS TotalSum; END$$
REPEAT UNTIL循环
REPEAT UNTIL循环先执行一次代码,然后判断条件是否满足,如果不满足则继续执行,语法如下:
REPEAT -statements UNTIL condition END REPEAT;
计算1到100内所有奇数的和。
CREATE PROCEDURE calculate_odd_sum() BEGIN DECLARE counter INT DEFAULT 1; DECLARE sum INT DEFAULT 0; REPEAT IF MOD(counter, ODD) = 1 THEN SET sum = sum + counter; END IF; SET counter = counter + 1; UNTIL counter > 100; END REPEAT; SELECT sum AS OddSum; END$$
LOOP循环
LOOP循环无限次执行某段代码,直到遇到LEAVE
语句跳出循环,语法如下:
[label:] LOOP -statements LEAVE label; -可选,用于跳出循环 END LOOP;
同样计算1到100的和。
CREATE PROCEDURE calculate_loop_sum() BEGIN DECLARE counter INT DEFAULT 1; DECLARE sum INT DEFAULT 0; [start:] LOOP SET sum = sum + counter; SET counter = counter + 1; IF counter > 100 THEN LEAVE start; END IF; END LOOP; SELECT sum AS TotalSum; END$$
五、存储过程中的参数传递与返回值处理
1 输入参数(IN)
输入参数用于向存储过程传递数据,语法如下:
CREATE PROCEDURE procedure_name(IN param_name data_type) BEGIN -statements using IN parameter END;
创建一个接受员工ID并返回员工姓名的存储过程:
DELIMITER $$ CREATE PROCEDURE get_employee_name(IN emp_id INT) BEGIN SELECT name INTO @emp_name FROM employees WHERE id = emp_id; SELECT @emp_name AS EmployeeName; END$$ DELIMITER ;
调用存储过程:
CALL get_employee_name(1001);
2 输出参数(OUT)
输出参数用于从存储过程返回数据,语法如下:
CREATE PROCEDURE procedure_name(OUT param_name data_type) BEGIN -statements setting the value of the OUT parameter END;
创建一个存储过程将员工姓名作为输出参数返回:
DELIMITER $$ CREATE PROCEDURE get_employee_name(OUT emp_name VARCHAR(100)) BEGIN SELECT name INTO emp_name FROM employees ORDER BY RAND(); --随机返回一个员工姓名 END$$ DELIMITER ;
调用存储过程并查看返回结果:
CALL get_employee_name(@emp_name); SELECT @emp_name AS EmployeeName; --显示返回的员工姓名
3 输入/输出参数(INOUT)
输入/输出参数既可以传递数据给存储过程,又可以从存储过程中返回数据,语法如下:
CREATE PROCEDURE procedure_name(INOUT param_name data_type) BEGIN -statements modifying the INOUT parameter END>
创建一个存储过程将传入的分数转换为等级并返回:
DELIMITER $$ CREATE PROCEDURE convert_score_to_grade(INOUT score DECIMAL(5,2), OUT grade VARCHAR(2)) BEGIN IF score >= 85 THEN SET grade = 'A'; ELSEIF score >= 70 THEN SET grade = 'B'; ELSEIF score >= 60 THEN SET grade = 'C'; ELSE SET grade = 'F'; END IF; END$$ DELIMITER ;
调用存储过程:
SET @score = 88.5; --初始化分数为88.5分 CALL convert_score_to_grade(@score, @grade); --调用存储过程并获取等级结果,@grade用于接收返回的等级结果。 SELECT @score AS Score, @grade AS Grade; --显示分数和对应的等级结果,score显示的是传入的分数,@grade显示的是经过存储过程转换后的等级结果。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1463351.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复