您的位置:首页 > 数据库 > MySQL

SQL的存储过程的理解与应用(以mysql为例)

2016-05-14 21:06 543 查看
这几天在听老师讲关于SQL的存储过程,但是感觉还是不是特别清楚它的存在意义,于是下去仔细又看了一下,在这里和大家分享一下,欢迎大家批评指正。

什么是存储过程?

存储过程,简单的来理解就是一段sql语句的集合,可以完成一些固定的功能,类似于C语言里面的函数或者java里面的方法,你可以传入参数,然后也可以让其将运行的结果带回来,但是其又与函数或者方法不同,不同之处在于一般的函数或者方法直接就可以通过var=function()的方法将结果带回,但是存储过程只能通过类似于C语言中指针带回结果的方法,将其带回。基本上所有的DBMS都对其有支持,mysql从5.0版本以后都支持存储过程,所以要练习或者实际使用存储过程的话,就要求mysql的版本不低于5.0。既然存储过程是一些sql语句的集合,那么就表明,存储过程可以包含一般的sql语句,包扩插入,删除,修改等语句。

为什么需要存储过程?

平时,大家一般都使用的是一条一条的sql语句交互式的来操作数据库,但是对于存储过程,很多人平时都用不到,但是存在即合理,他一定有它的好处,下面就讲一下:

运行速度相对比较快捷。相对于一条一条的交互式执行,存储过程省略了交互,可以提升运行速度,还有就是一般的语句执行时,要经过将语句从客户端发送到服务器,服务器编译,优化sql语句,然后执行sql语句,最后将结果发送到服务器端,服务器存储过程一般在创建后,就已经编译优化好放在服务器端,执行的时候不需要再进行执行钱前的工作,可以大大缩短运行时间,提升运行效率。
模块化编程,增强了sql代码的复用性和共享性。通过存储过程,将需要的一系列操作写在一起,使SQL代码更加模块化,同时,也可以进行存储过程的共享,从而减少代码的量。
减少网络通信,缓解网络拥塞。由于一般的DBMS都是CS架构的,所以客户端与服务器在进行数据交互时,不可避免的就带来了网络通信,如果不使用存储过程,那么客户端与服务器需要进行频繁的数据交互,这就造成大量的没必要的网络流量,从而导致网络拥塞。
使系统更加安全。可以设置某些用户可以通过存储过程对数据库进行访问,但是却不能通过sql命令来进行数据库的访问,这样就可以避免某些用户的操作失误,或者恶意破坏。

怎样创建存储过程?

存储过程在mysql里面的关键字为procedure,其创建语法为:

create procedure 存储过程名([in | out] 变量名 类型,...)
begin
需要进行的操作语句
end;



下面通过例子来讲解具体的存储过程的创建方法。创建一个Student的数据表,表的属性如下:


表中的数据如下:



我们想创建一个叫sele的存储过程,每次来选出表中的所有数据,那么如何创建呢? 

Create procedure sele()
Begin
Select * from Student;
End;
注意:如果不是使用图形化界面,运行上面的语句会出错,因为解释器默认分号来作为语句结束符的,而begin和end之间的语句也必须用分号来进行结束,这就造成了冲突,于是就得使用delimiter来临时的将结束符换掉,所以如果你使用的是命令行的那种,则就是下面语句: 
Delimiter //
Create procedure sele()
Begin
Select * from Student;
End //
Delimiter ;
显示结果如下:



执行存储过程使用call+存储过程名,实例如下:



上面结果比较简单,有人想问,我想通过传入指定的值,从而得到指定的结果,该咋办?下面看实例:
我想查看指定id的人的姓名和年龄该咋办?下面看: 
Delimiter //
Create procedure getInfo(in S_id int,out S_name varchar(20),out S_age int)
Begin
Select Sname into S_name , age into S_age from Student whrer id=S_id;
End //
Delimiter ;
执行结果:



调用此存储过程call getInfo(2,@name,@age); 出现:



至此,基本已经将存储过程讲完了,但是还有些问题,就是在选择的过程中,数据只能是唯一的,如果不唯一就会报错。

查看原文:http://www.dreamchasinger.cn/2016/05/14/sql%e7%9a%84%e5%ad%98%e5%82%a8%e8%bf%87%e7%a8%8b%e7%9a%84%e7%90%86%e8%a7%a3%e4%b8%8e%e5%ba%94%e7%94%a8%e4%bb%a5mysql%e4%b8%ba%e4%be%8b/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql sql