mysql存储过程

标签: mysql  存储过程

mysql的存储过程,及使用场景,和存储函数、触发器的区别,基本语法

  • 存储过程,存储函数,触发器和事件是自从MySQL 5.0版本以来,这些功能被添加到MySQL数据库引擎,使mysql更加灵活和强大。

- 存储过程:

存储过程(StoredProcedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。
存储过程说白了就是一堆 SQL 的合并。中间加了点逻辑控制。

- 使用场景:

存储过程处理比较复杂的业务时比较实用。
比如说,一个复杂的数据操作。如果你在前台处理的话。可能会涉及到多次数据库连接。但如果你用存储过程的话。就只有一次。从响应时间上来说有优势。也就是说存储过程可以给我们带来运行效率提高的好处。
另外,程序容易出现 BUG
不稳定,而存储过程,只要数据库不出现问题,基本上是不会出现什么问题的。也就是说从安全上讲,使用了存储过程的系统更加稳定。
其威力和优势主要体现在:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL
语句,可能要多次连接数据库。而换成存储过程,只需要连接一次数据库就可以了。

3.存储过程可以重复使用, 而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响,可减少数据库开发人员的工作量。

4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。 存储过程(procedure)和存储函数( function)的区别:
1:) 存储函数和存储过程统称为存储例程(store routine),存储函数的限制比较多,例如不能用临时表,只能用表变量,而存储过程的限制较少,存储过程的实现功能要复杂些,而函数的实现功能针对性比较强。

2:) 存储过程一般都是独立使用,使用call
加存储过程名调用。而存储函数可以在SQL语句(select)中使用(比如在查询是经常使用的系统自定义的sum 、avg 、max函数)。

3:) 返回值不同 ,存储函数要求必须有返回值,且仅返回一个结果值,而存储过程可以没有返回值还可以返回一个结果集(out,inout)

4:) 参数不同,存储函数的参数类似于存储过程的IN入参,而存储过程即可有入参IN,也可由出参OUT,和INOUT
(1): IN数据只是从外部传入内部使用(值传递),可以是数值也可以是变量
(2): OUT只允许过程内部使用(不用外部数据),给外部使用的(引用传递:外部的数据会被先清空才会进入到内部),只能是变量
(3): INOUT 外部可以在内部使用,内部修改的也可以给外部使用,典型的引用 传递,只能传递变量

- 存储过程和触发器的区别:

触发器是一种特殊的存储过程,存储过程需要手动调用,而触发器是经过事件触发而执行的,触发器是绑定一张表,在表中创建保存,而存储过程是在一个数据库中创建并保存。
触发器=存储过程+事务+自定义约束

存储过程的编写:

基本语法:
1)
存储过程的参数有 入参 IN, 出参 OUT , INOUT
IN 从外部传参 在内部使用,调用时必须传值
OUT 就是相当于返回值
INOUT 把出参和入参放到一块儿,在调用时传值,值可以返回
2)
declare 用来声明变量,default 赋默认值,set 赋值
3)创建存储过程:
delimiter Createprocedure()Begin(;)End
delimiter
注:delimiterdelimiter//delimitermysql;sql,delimiter符号后才能成功执行,这个窗口就废了)。

4)调用存储过程
Call 存储过程名( )
注意:如果存储过程后面必须加( ),如果有参数 在扩内写上 参数
5)删除存储过程
Drop procedure 存储过程名
注意:不能删除一个 在其他 存储过程使用了的 存储过程
6)显示所有数据库所有存储过程的 基本信息
Show procedure status
7) show create procedure 存储过程名
显示某一个mysql存储过程的详细信息

If else:

delimiter $
create procedure pro_test09(IN num int,OUT sys varchar(255))
begin
if num=0 then
set sys='等于0';
elseif num>0 then
set sys='大于0';
elseif num<0 then
set sys='小于0';
end fi
end$
delimiter

一些例子:
无参无返回值:
查看book表中的所有数据

DELIMITER $
create procedure pro_test01()
begin
select * from  book;
end $
delimiter

调用: pro_test01();

有参无返回值:
根据name 查询 详细信息

delimiter $
 create procedure pro_test02(IN name varchar(255))
 begin
 select * from book where bname=name;
 end $
delimiter

调用及结果:

这里写图片描述
无参有返回值:
查看book中有多少条记录

delimiter $
create procedure pro_test03(OUT  sum int)
begin
select count(*) into sum from book;
end $
delimiter

调用及结果:
没有写delimiter 还原 了,一直结束不了,只能输$符
这里写图片描述

有参有返回值:
求从1 加到 num的和

delimiter $
 create procedure pro_test04(IN num int,OUT result int)
 begin
 declare i int default 1;    #定义一个变量i,初始值为 1
 declare sum int default 0;  #定义一个变量sum ,初始值 为  0
 WHILE i < num DO
 SET sum = sum +i;
 SET i = i+1;
 END WHILE;
 SET result=sum;
 end $;
delimiter

调用及结果(1-10的和)
这里写图片描述

参数是INOUT
传年份返回年龄

delimiter $
create procedure pro_test05(INOUT age int)
begin
set age = 2018 - age;
end $
delimiter

调用及结果

在设置变量的值时 要用 set . @代表局部表量,@@代表全局变量

这里写图片描述

这里写图片描述

原文链接:加载失败,请重新获取