1.什么是存储过程
- 一组可编程函数,是为了满足特定功能的SQL语句集
- 存储过程就是具有名字的一段代码,用来完成个特定的功能
- 创建的存储过程保存在数据库的数据字典中
2.为什么要用存储过程
- 将重复性很高的操作,封装到一个存储过程中,简化了对这些SQL的调用
- 批量处理
- 统一接口,确保数据安全
相对于Oracle来说,Mysql的存储过程相对功能较弱,使用较少
3.存储过程的创建和调用
1. delimiter$$
他与存储过程无关
- delimiter$$ 将标准分隔符 - 分号 (;) 更改为 两个 $
- 将存储过程作为整体,而不是一次解释每条语句
- 告诉mysql解释器,该段命令已经结束了。默认情况下,delimiter 是分号,在命令行客户端中,如果有一行命令以分号结束,回车后,mysql将会执行该命令。如果不希望这样,就可以
delimiter$$
,这样只有在$$
出现后,mysql解释器才会执行 这段语句
-
2.创建和调用存储过程
# 创建存储过程
CREATE PROCEDURE 名称()
BEGIN
语句
END$$
# 调用存储过程
CALL 名称()
如图:
右击鼠标 运行已选择的
然后运行CALL show_content()
这句,就会得到执行结果。
将查询窗口关闭,重新打开一个新的查询窗口,可以直接使用CALL show_content
,即可执行得到结果
3.查看存储过程
查看所有存储过程:
SHOW PROCEDURE STATUS;
- 查看指定数据库中的存储过程:
SHOW PROCEDURE STATUS WHERE DB = 'publiccms';
- 查看指定存储过程源码 :
SHOW CREATE PROCEDURE show_emp;
- 删除指定存储过程:
DROP PROCEDURE show_emp;
4.存储过程变量
delimiter $$ CREATE PROCEDURE test() BEGIN -- 声明变量,默认为空 DECLARE res VARCHAR(255) DEFAULT ''; DELETE x,y int DEFAULT 0 -- 声明两个变量,类型为int ,默认为 0 -- 赋值 set 方式 set x = 3; set y = 4; DECLARE avgRes DOUBLE DEFAULT 0; -- 另一种赋值方式 into 方式 select avg(salary) into avgRes from emp end$$ -- 什么的变量,如 x,y等,只能在 begin end 之间有效
5.存储过程参数传递
in-- 根据传入的名称,获取对应的信息 delimiter $$ create PROCEDURE getName(in name VARCHAR(255)) BEGIN SELECT * FROM emp where ename = name; end$$ delimiter ;
CALL getName('鲁班')
out
-- 传入姓名,得出薪水
delimiter $$
create procedure getSalary(in name varchar(255),out money int)
BEGIN
select salary into money from emp where ename = name;
end$$
delimiter ;
CALL getSalary('李白',@s) -- @s 代表返回的数
select @s; -- 也可以写为 select @s from DUAL
-- DUAL 是一个虚拟的表
inout 既是输入,又是输出
delimiter $$
create procedure test(inout num int,in inc int) -- inout ,既是输入,也是输出
BEGIN
set num = num + inc;
end$$
delimiter ;
set @num1 = 20; -- @ 代表地址传递
CALL test(@num1, 10);
select @num1;