17.1 基础
储存过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。
创建语法:
delimiter 标识符create procedure 储存过程名称(参数)beginsql语句集end标识符
调用语法:
call 储存过程名称(参数);
删除语法:
drop procedure 储存过程名称
注意:储存过程不支持修改,如果要修改,只能删除了重建
基础案例:
delimiter $$
create procedure querygradesub(in gn varchar(50))
begin
declare gid int default 0;
select gradeId into gid from grade where gradeName=gn;
select * from subject where gradeId=gid;
end
$$
call querygradesub('三年级');#调用存储过程
17.2 定义参数
定义参数的语法:
(in 参数名1 数据类型,out 参数名2 数据类型,...,inout 参数名n 数据类型)
in 输入参数 (只接收用户数据传递)
delimiter !!
create procedure demo1(in d int)
begin
declare result varchar(50);
case
when d>=1 and d<=5 then set result="这是工作日";
when d=6 then set result='这是星期六';
when d=7 then set result='这是星期天';
else set result='数据错误';
end case;
select result;
end
!!
call demo1(7)
out 输出参数 (不接收用户数据传递,但它会向用户传递数据)
delimiter !!
create procedure demo1(in d int,out result varchar(50))
begin
case
when d>=1 and d<=5 then set result="这是工作日";
when d=6 then set result='这是星期六';
when d=7 then set result='这是星期天';
else set result='数据错误';
end case;
end
!!
call demo1(7,@r); #@r直接就这样写上去,就相当于是引用数据类型,在存储过程中发生了变化 @r也会跟着发生变化
select @r;
inout 输入输出参数 (既接收用户数据传递,又向用户传递数据)
delimiter **
create procedure demo2(inout sum int)
begin
declare i int default 1;
while i<=100 do
set sum=sum+i;
set i=i+1;
end while;
end
**
set @sum=50;
call demo2(@sum);
select @sum;
17.3 定义局部变量
1、定义变量必须在begin end之间
2、定义变量要写在begin之下,其他代码之上
定义变量语法:
declare 变量名 数据类型 default 默认值;
declare i int; 类似于 int i;
declare i int default 1; 类似于 int i=1;
赋值:
set 变量名=值; 注意局部变量的使用不需要再写@ @变量名只是在存储过程之外时使用
select count(1) into 变量名 from 表名; *在存储过程中使用into进行赋值 , 在存储过程之外 select @c:=count(1) from 表名.
select gradeId into gid from grade where gradeName=gn;
注意: 必须保证select只能返回一个结果