目录

4.8存储过程

存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。存储过程是数据库中的一个重要功能,存储过程可以用来转换数据、数据迁移、制作报表,它类似于编程语言,一次执行成功,就可以随时被调用,避免了开发人员重复编写相同SQL语句的问题,完成指定的功能操作。

 存储过程的优点如下:

① 增强了SQL语句的灵活性;

② 固定的业务模块化封装,较少开发重复性;

③ 执行速度很快;

④ 存储过程被做为一种安全机制,充分的得到了利用

存储过程大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。

4.8.1 存储过程的创建

编写存储过程并不是件简单的事情,可能存储过程中需要复杂的SQL语句,并且要有创建存储过程的权限。但是使用存储过程将简化操作,减少冗余的操作步骤,同时,还可以减少操作过程中的失误,提高效率,因此存储过程是非常有用的。

1可以使用 CREATE PROCEDURE 语句创建存储过程,语法格式如下:
2CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
3[过程参数[,…] ] 格式
4[ IN | OUT | INOUT ] <参数名> <类型>
5
6例:输出当前数据库的用户个数
7DELIMITER //
8 CREATE PROCEDURE myproc(OUT s int)
9 BEGIN
10 SELECT COUNT(*) INTO s FROM mysql.user;
11 END
12 //
13DELIMITER ;
14
15注:MySQL 服务器在处理时会以遇到的第一条SQL语句结尾处的分号作为整个程序的结束符,而不再去处理存储过程体中后面的SQL语句,为了解决这个问题,通常使用 DELIMITER 命令将结束命令修改为其他字符,语法格式如下:
16#成功执行这条 SQL 语句后,任何命令、语句或程序的结束标志就换为两个问号“//”
17mysql > DELIMITER //
18若希望换回默认的分号“;”输入下列语句即可,DELIMITER 和分号“;”之间一定要有一个空格
19mysql > DELIMITER ;
20
21#调用存储过程
22mysql> call myproc(@s);
23mysql> select @s;
24+------+
25| @s |
26+------+
27| 6 |
28+------+

4.8.2 存储过程类型

按照传参的不同,可以讲存储过程分为如下几类,IN表示输入参数,OUT表示输出参数,INOUT表示即可以输入也可以输出。

4.8.3 变量的使用

变量可以在子程序中声明并使用,这些变量的作用范围是BEGIN...IN程序中。

11)定义变量
2在存储过程中使用DECLARE语句定义变量,语法格式如下:
3DECLARE var_name[,varname]... date_type [DEFAULT value];
4
5#总行数
6DECLARE cnt INT DEFAULT 0;
7#循环变量i
8DECLARE i INT DEFAULT 0;
9
102)为变量赋值
11MySQL中使用SET语句为变量赋值,语法格式如下:
12SET var_name=expr [,var_name=expr] ...;
13MySQL中哈可以通过SELECT...INTO...为一个或多个变量赋值,语法如下:
14SELECT col_name[,...] INTO var_name[,...] table_expr;
15例如:select count(*) into out_cnt from mysql.user;

4.8.4 游标的使用

查询语句可能返回多条记录,如果数据量非常大,需要在存储过程和存储函数中使用游标来逐条读取查询结果集中的记录。游标必须在声明处理程序之前被声明,并且变量和条件还必须在声明游标或处理程序之前被声明,游标只能在存储存储过程和函数中使用。

11)声明游标
2MySQL中使用DECLARE关键字来声明光标,其语法的基本形式如下:
3DECLARE cursor_name CURSOR FOR select_statement
4注解:
5cursor_name参数表示光标的名称;
6select_statement参数表示SELECT语句的内容,返回一个用于创建光标的结果集;
7
82)打开游标
9打开光标的语法如下:
10OPEN cursor_name{游标名称}
11
124)使用游标
13使用游标的语法如下:
14FETCH cursor_name INTO var_name [, var_name] ...{参数名称}
15注解:
16cursor_name参数表示光标的名称;
17var_name参数表示将光标中的SELECT语句查询出来的信息存入该参数中,var_name必须在声明光标之前就定义好。
18
195)关闭游标
20关闭游标的语句如下:
21CLOSE cursor_name{游标名称}

4.8.5 流程控制

流程控制语句用来根据条件控制语句的执行。MySQL中用来构造流程控制的语句有:IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句和WHILE语句。