储存过程就是数据库中保存的一系列sql命令的集合,也可以看作是相互之间有关系的sql命令组织在一起的一个小程序,这些sql命令通常并非简单地组合在一起,还可以使用各种条件判断、循环控制等来实现简单的sql命令不能实现的复杂功能。
存储过程的优势:
1、提高执行性能
通常在sql客户端执行sql命令时数据库会有解析到编译的一个前期过程。而存储过程则是事先完成了解析、编译的处理后保存在数据库中的,执行时能减轻数据库负担。
2、可减轻网络负担
使用存储过程后,复杂的数据库操作也可以在数据库服务器中完成。只需要从应用程序传递给数据库必要的参数就行。
3、可防止对表的直接访问
可以禁止对表本身的访问,只赋予用户对相关存储过程的访问权限,只允许通过储存过程访问表。
4、可将数据库的处理黑匣子化
应用程序完全不用考虑储存过程的内部详细处理,只需要知道调用那个存储过程就好了。
使用存储过程:
创建:
mysql存储过程语法
上面就是将“处理内容”定义成名为 #存储过程名# 的存储过程
存储过程中可以指定参数,参数分为输入参数(接受调用方的数据,默认),输出参数(向调用方返回处理结果)。使用关键字in、out、inout来指定。inout既是输入型也是输出型。
delimiter是改变分隔符的,将默认的分隔符修改成别的符号。默认是[;],因为存储过程本身就是命令的集合,所以会包含[;],因此使用delimiter来区分。
例子:
创建存储过程
存储过程中可使用的控制语句:
具体的控制语句有条件分支选择语句、循环控制语句等。
可使用的控制语句
查看存储过程:show procedure status;
调用存储过程:
call #存储过程名字#(参数,…)
在调用存储过程的时候,如果出现参数数目不符(或多或少)的情况,将会显示错误信息。
定义输出参数:
当指定了out/outin类型的参数时,通过给参数名的头部添加@符号可以将处理结果保存到out型变量中,然后使用select @变量名来显示变量信息。
定义本地变量:(局部变量)
在各个条件分支程序块中,会有一些执行相似的代码,也就是有些执行的部分是一样的,我们可以将这些相同的部分移动到条件判断外,在分支程序块中只有检索条件字符的部分代码。也就是将检索条件字符存放在本地变量的变量中。
使用局部变量必须用 declare 声明变量的名称以及数据类型。
declare的语法
给变量赋值:set #变量名# =值
例子:
没有定义本地变量前的使用:
定义了本地变量后的使用:
对比可见,使用本地变量显然将[select id,author,title from article where author=]相同的部份移到条件判断外了。
存储过程的使用:
1、当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时就要考虑用存储过程;
2、当在一个事务的完成需要很复杂的业务逻辑时例如对多个数据的操作或者对多个状态的判断更改等要考虑;
3、还有就是在比较复杂的统计和汇总中也要考虑,但是过多的使用存储过程会降低系统的移植性。