18、存储过程

存储过程

简单来说,存储过程(Stored Procedure)是为以后的使用而保存的一条或多条MySQL语句的集合,可以将其视为批处理,虽然其作用不仅限于批处理

使用存储过程的优点

  • 把处理过程封装,简化复杂的操作
  • 封装了过程,统一了输入输出,能减少使用错误
  • 减少对基础数据的访问,从而减少数据讹误
  • 可以编写更灵活的代码

delimiter //
一般情况下MYSQL以;结尾表示确认输入并执行语句,但在存储过程中;不是表示结束,因此可以用该命令将;号改为//表示确认输入并执行。

1、创建存储过程

delimiter //
create procedure sp_name()
begin
    ......
end//
delimiter ;

2、调用存储过程

call sp_name();

3、删除存储过程

drop procedure sp_name;
drop procedure if exists sp_name;

4、查看存储过程

show create procedure sp_name;
show procedure status;

5、IN、OUT、INOUT

  • IN 输入参数
    表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
    仅需要将数据传入存储过程,并不需要返回计算后的该值。
    只能当做传入参数
  • OUT 输出参数
    该值可在存储过程内部被改变,并可返回
    不接受外部传入的数据,仅返回计算之后的值。
    只能当做转出参数
  • INOUT 输入输出参数
    调用时指定,并且可被改变和返回
    需要数据传入存储过程经过调用计算后,再传出返回值
    可当做传入转出参数
# 根据员工名称查出员工所在部门名称
delimiter //
create procedure pr_dname(in empName varchar(20))
begin
select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno where ename=empName;
end
//
delimiter ;
# 根据员工编号,输入的年数,查出其总共应发工资
delimiter //
create procedure pr_pay(in empno int(4), in y int(2))
begin
select e.ename,e.sal*12*y as pay from emp e where e.empno=empno;
end
//
delimiter ;
# 输入部门编号,输出部门平均工资
delimiter //
create procedure pr_avgsal(in deptno int(2),out avgsal double(7,2))
begin
select avg(e.sal) into avgsal from emp e group by e.deptno having e.deptno=deptno;
end
//
delimiter ;
call pr_avgsal(10,@avgsal);
select @avgsal;
# 输入月薪,计算年薪
delimiter //
create procedure pr_test1(inout m double(7,2))
begin
select m*12 into m;
end
//
delimiter ;
set @m=1000;
call pr_test1(@m);
select @m;

6、分支语句

delimiter //
create procedure pr_test2(in i int)
begin
select if(i>0,'windows','linux'); #if简单二分支
end
//
delimiter ;
delimiter //
create procedure pr_test3(in i int)
begin
declare j varchar(20);
# 多分支if语句
if i>0 then set j='windows';
elseif i<0 then set j='linux';
else set j='ios';
end if;
select j;
end
//
delimiter ;
delimiter //
create procedure pr_test4(in i int)
begin
declare j varchar(20);
# case等值判断
case i
when 1 then set j='windows';
when 0 then set j='ios';
else set j='linux';
end case;
select j;
end
//
delimiter ;
delimiter //
create procedure pr_test5(in i int)
begin
declare j varchar(20);
# case条件区间判断
case
when i>0 then set j='windows';
when i<0 then set j='ios';
else set j='linux';
end case;
select j;
end
//
delimiter ;

7、循环语句

mysql有3种循环语句

  • while
    label:while 条件 do
    statements;
    end while lable;
  • loop
    label:loop
    statements;
    end loop label;
  • repeat
    label:repeat
    statements
    until 结束条件;
    end repeat label;
# 给dept表插入指定数目的数据
# while循环
delimiter //
create procedure pr_test12(in n int)
begin
declare i int default 1;
a:while i<=n do
insert into dept (deptno,dname,loc) values(50+i,concat('Sales',i),concat('London',i));
set i=i+1;
end while a;
end
//
delimiter ;
# 给dept表插入指定数目的数据
# loop循环,并使用leave跳出循环
delimiter //
create procedure pr_test13(in n int)
begin
declare i int default 1;
a:loop
insert into dept (deptno,dname,loc) values(50+i,concat('Sales',i),concat('London',i));
set i=i+1;
if i>n then leave a;
end if;
end loop a;
end
//
delimiter ;
# 给dept表插入指定数目的数据,但不插入5的倍数的数据
# repeat循环,iterate跳出此次执行,继续执行下一次
delimiter //
create procedure pr_test14(in n int)
begin
declare i int default 0;
a:repeat
set i=i+1;
if (i mod 5 = 0) then iterate a;
end if;
insert into dept (deptno,dname,loc) values(50+i,concat('Sales',i),concat('London',i));
until i>=n
end repeat a;
end
//
delimiter ;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339