存储过程是带有逻辑的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<=numDOSET 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 存储过程名称