5.1什么是存储过程
带有逻辑的sql语句
之前的sql没有条件判断,没有循环
存储过程带上流程控制语句(if while)
5.2存储过程的特点
1) 执行效率非常快!存储过程在数据库服务端执行
2) 移值性很差,不同数据库不能一直
语法:
DELIMITER $ --声明结束符号 CREATE PROCEDURE pro_test() BEGIN --可写多个sql语句 SELECT × FROM employee; END $
-- 执行存储过程
CALL pro_test();
参数
带有输入参数的存储过程
--需求传入一个员工的id,查询员工信息
//带有输入参数的存储过程
DELIMITER $
CREATE PROCEDURE pro_findById(IN eid INT) --IN传入参数
BEGIN
SELECT* FROM emplotee WHERE id = eid;
END $
---调用
CALL pro_findById(4);
---带有输出参数的存储过程
DELIMITER $
CREATE PROCEDURE pro_testOut(OUT str VARCHAR(20)) --OUT:输出参数
BEGIN
SET str = "这是一个输出参数"
END $
--删除存储过程
drop PROCEDURE pro_testOut;
--如何接受返回参数的值
--mysql全局变量
参看所有全局变量
--show variables
模糊查询全局变量
--show variables like "character_%"
接受数据编码设置
--character_set_client;
输出数据编码设置
--character_set_results;
×××会话变量---只存在于当前客户端与服务器端的一次连接当中,如果链接断开,那么会话变量全部消失
定义一个会话的变量
SET @NAME =‘eric‘
查看会话变量
select @NAME;
×××局部变量,只要存储过程执行完毕,局部变量就丢失
×××1)定义一个会话变量name,2)使用name会话
CALL pro_testOut(@NAME);
***带有输入输出参数的存储过程
DELIMITER $
CREATE PROCEDURE pro_testInuut(INOUT n INT)
BEGIN
SELECT n;
SET n = 500;
END$
--带有条件判断的存储过程
DELIMITER $
CREATE PROCEFURE pro_testIf(IN num INT , OUT str VARCHAR(20))
BEGIN
IF num = 1 THEN
SET str="星期一";
ELSEIF num = 2 THEN
SET str="星期二";
ELSE
SET str="输入有错误"
END IF;
END$
CALL pro_testIf(1,@str)
SELECT @ str;
**带有循环过程的存储过程
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;
i = i +1;
END WHILE;
SET result = vsum;
END $
使用查询的结果作为返回值
DELIMITER $
CRETAE PROCEDURE pro_findById(IN eid INT, OUT vname VARCHAR(20))
BEGIN
SELECT empName INTO vname FROM employee WHERE id = eid;
END $