存储过程
创建存储过程
开发过程中,经常会遇到重复使用某一功能的情况。为此,mysql引入了存储过程。存储过程就是一条或多条sql语句的集合,当队数据库进行一系列复杂操作时,存储过程可以将这些复杂操作封装或一个代码块,以便重复使用。
create procedure sp_name ([proc paramenter]) [characteristics...] routine_body
- sp_name——存储过程的名称
- proc paramenter——参数列表
创建存储过程的例子
创建一张表
DELIMITER ——用于定义标志语句结束的结束符
下图创建了一个存储过程proc,功能为select * from student 。传入的参数为空(即proc(),如果想传入参数,可以将参数写在空格里)
定义结束符的目的——mysql中默认的结束符是 :,如果不顶用别的结束符,当执行到select * from student ;时,系统认为这句执行结束了,就退了,就无法创建存储过程,更不用说在存储过程里面执行多条语句了。
创建完存储过程之后,记得把结束符改回——;
调用存储过程
使用关键字call调用存储过程
查看存储过程
1、show status
2、show create
3、直接从表中查询存储过程的方式
修改存储过程
1、修改存储过程的特性
2、修改存储过程的内容
mysql目前不支持
删除存储过程
存储过程中变量的使用
定义变量
变量的声明一定是在存储过程的begin和end之间,作用范围是当前的存储过程。
declare var_name [,varname] _date_type [default value];
例子——定义一个名称为myvariable的变量,类型为int类型,默认值为100。
修改变量
方式一
set var_name = expr [, var_name=expr]...;
方式二
用查询的方式,从数据库中获取数据,赋值给某个变量
例子——定义变量,保存学生表中查询到的班级信息和性别性别信息
存储过程中定义条件和处理程序
定义一些条件,当符合这些条件时,我们应该使用怎样的处理程序对其进行处理。这就是定义条件和处理程序
定义条件
declare condition_name condition for [condition_type];
condition_type有两种形式
- sqlstate [value] sqlstate_value
- mysql_error_code
例子——定义如下所示的条件
上图中error_code是1149,sqlstate是42000
题目——定义error 1149(42000) 错误,名称为command_not_allowed;
declare command_not_allowed condition for SQLSTATE 42000;
declare command_not_allowed condition for 1149;
定义处理程序
handler_type有三种类型
- continue——表示遇到错误不处理,继续执行
- exit——遇到错误马上退出
- undo——遇到错误之后撤回之前的操作,mysql目前不支持
condition_value
- sqlstate[value]——sqlstate_value包含五个字符的字符串错误值
- condition_name——表示declare condition定义的错误名称
- sqlwarning ——匹配所有以01开头的sqltate错误码
- not found—— 匹配所有以02开头的sqltate错误码
- sqlexception——匹配所有没有被sqlwarning或not found捕获的sqlstate错误代码
- mysql_error_code匹配数值类型错误代码
光标(游标)的使用
用于从一堆的遍历结果中查询我们要的结果
声明
使用
使用open语句打开光标,使用fetch语句从中获取一个数据,赋值到变量(该变量需要在游标使用之前就定义好)中
关闭游标
存储过程中的流程控制
if
例子
创建一个存储过程判断变量V是否是null,输出对应的信息
1、先创建存储过程
2、调用存储过程
case
例子
loop
例子
repeat——和do while很像
用于创建一个带有条件判断的循环,每次语句执行完毕之后,会对表达式进行判断。如果表达式为真,则循环结束;否则,重复执行循环语句中的内容。
while