存储过程是带有逻辑的SQL语句,优点是执行效率高。缺点是可移植性差
1、存储过程语法
DELIMITER $ --声明结束符 CREATE PROCEDURE pro_test() --创建存储过程 存储过程名称(参数列表) BEGIN SELECT * FROM employee --可以写多条SQL语句 SQL语句+流程控制 END $ --结束
2、调用存储过程
CALL pro_test --CALL 存储过程名称
3、储存过程参数
IN 表示输入参数
OUT 表示输出参数
INOUT 表示输入、输出参数
3.1带有输入参数的存储过程
需求:通过传入一个员工的id,查询员工信息
DELIMITER $ CREATE PROCEDURE pro_findById(IN eid INT) --IN: 输入参数 BEGIN SELECT * FROM employee WHERE id = eid; END $
调用
CALL pro_findById(2);
3.2 带有输出参数的存储过程
DELIMITER $ CREATE PROCEDURE pro_testOut (OUT str VARCHAR(20)) BEGIN SET str="这是一个输出参数"; END $
调用带返回参数的存储过程
先介绍下MySQL变量 1、全局变量(内置变量) 查看所有全局变量 show variables
查看跟字符集有关的全局变量 SHOW VARIABLES LIKE 'character_%';
查看某个全局变量 SELECT @@变量名
修改全局变量 SET 变量名=新值
常用全局变量 --character_set_client : mysql服务器能够接收数据的编码 --character_set_results : mysql服务器输出数据的编码
2、会话变量:只存在于当前的客户端与数据库服务器端的一次连接当中,如果连接断开,会话丢失
定义一个会话变量 SET @变量=值
查看会话变量 SELECT @变量
3、局部变量:在存储过程中使用的变量 就是存储变量,只存储过程执行完毕,那么局部变量就会消失。
变量介绍完,现在说明如何调用带输出参数的存储过程
1、定义一个会话变量
CALL pro_testOut(@NAME) //1)定义一个会话变量NAME,2)使用NAME会话变量
2、查看会话变量
SELECT @NAME;
3.3带有输入输出参数的存储过程
DELIMITER $ CREATE PROCEDURE pro_testInOut(INOUT n INT) --INOUT输入输出参数 BEGIN SELECT n; --作为输入参数传入存储过程, 该变量变为局部变量 不用加'@',但在存储过程外仍然是会话变量 SET n = 500; END $ --调用 输入 SET @n = 10; CALL pro_testInOut(@n); --结果输出10 输入 SELECT @n; --结果输出500
4、带有条件判断的存储过程
需求:输入一个整数。如果为1,则返回“星期一”,如果是2,则返回“星期二”,如果是3,则返回“星期三”。如果 是其他数值,返回“错误的数值”
DELIMITER $ CREATE PROCEDURE pro_testIf(IN num INT, OUT str VARCHAR(10)) BEGIN IF num = 1 THEN SET str="星期一"; ELSEIF num = 2 THEN SET str = "星期二"; ELSEIF num = 3 THEN SET str = "星期三";
ELSE SET str = "输入的值不在指定范围内"; END IF; END $ --调用 CALL pro_testIF(1, @str); SELECT @str;
5、带有循环功能的存储过程
--需求:输入一个整数,求和。例如输入100.求1-100的和
DELIMITER $ CREATE PROCEDURE pro_testWhile(IN num INT, OUT result INT) BEGIN --定义一个局部变量 DECLARE i INT DEFAULT 1; DECLARE vsum INT DEFAULT 0; WHILE i<=num DO SET vsum = vsum + i; SET i = i+1; END WHILE; SET result = vsum; END $ --调用 CALL pro_testWhile(100, @result); SELECT @result;
6、使用查询结果作为返回值
DELIMITER $ CREATE PROCEDURE pro_findById(IN eid INT, OUT vnaem VARCHAR(20)) BEGIN SELECT empName INTO vname FROM employee WHERE id = eid; END $ --调用 CALL pro_findByID(1, @NAME); SELECT @NAME
7、删除存储过程
DROP PROCEDURE 存储过程名称