108
第6章
MySQL过程式数据库对象
MySQL自5.0版本开始支持存储过程、存储函数、触发器和事件功能的实现。本章讨论这4种过程式数据库对象。mysql存储过程使用
6.1 存 储 过 程
在MySQL中,可以定义一段程序存放在数据库中,这样的程序称为存储过程,它是最重要的数据库对象之一。存储过程实质上就是一段代码,它可以由声明式SQL语句(如CREATE、UPDATE和SELECT等)和过程式SQL语句(如IF-THEN-ELSE)组成。存储过程可以由程序、触发器或者另一个存储过程来调用,从而激活它。
存储过程的优点如下。
(1)存储过程在服务器端运行,执行速度快。
(2)存储过程执行一次后,其执行规划就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。
(3)确保数据库安全。使用存储过程可以完成所有数据库操作,并可通过编程方式控制对数据库信息的访问。
6.1.1 创建存储过程
创建存储过程命令如下,其语法格式为:
CREATE PROCEDURE 存储过程名 ([参数 ... ])
[特征 ...]  存储过程体
1.存储过程参数
参数格式为:
[ IN | OUT | INOUT ] 参数名参数类型
●系统默认在当前数据库中创建。需要在特定数据库中创建存储过程时,则要在
名称前面加上数据库的名称,格式为:
数据库名.存储过程名
●当存储过程有多个参数的时候中间用逗号隔开。MySQL存储过程支持三种类型
的参数:输入参数、输出参数和输入/输出参数,关键字分别是IN、OUT和INOUT。输
109
入参数使数据可以传递给一个存储过程。当需要返回一个答案或结果的时候,使用输出参数。输入/输出参数既可以充当输入参数也可以充当输出参数。
存储过程可以有0个、1个或多个参数。存储过程即使不加参数,名称后面的括号也是不可
省略的。  参数的名字不要采用列的名字,否则虽然不会返回出错消息,但是存储过程中的SQL 语句会将参数名看作列名,从而引发不可预知的结果。
2.存储过程特征
特征格式为:    LANGUAGE SQL  | [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }  | SQL SECURITY { DEFINER | INVOKER }  | COMMENT 'string'
●  LANGUAGE SQL :表明编写这个存储过程的语言为SQL 语言。目前来讲,MySQL 存储过程还不能用外部编程语言来编写,也就是说,这个选项可以不指定,将来会对其扩展,最有可能第一个被支持的语言是PHP 。 ●  DETERMINISTIC :设置为DETERMINISTIC 表示存储过程对同样的输入参数产生相同的结果,设置为NOT DETERMINISTIC 则表示会产生不确定的结果。默认为NOT DETERMINISTIC 。 ●  CONTAINS SQL :表示存储过程不包含读或写数据的语句。 NO SQL :表示存储过程不包含SQL 语句。 READS SQL DATA :表示存储过程包含读数据的语句,但不包含写数据的语句。 MODIFIES SQL DATA :表示存储过程包含写数据的语句。如果这些特征没有明确给定,默认的是CONTAINS SQL 。 ●  SQL SECURITY :可以用来指定存储过程是使用创建该存储过程的用户(DEFINER )的许可来执行,还是使用调用者(INVOKER )的许可来执行。默认值是DEFINER 。 ●  COMMENT 'string':对存储过程的描述(就是备注),string 为描述内容。这个信息可以用SHOW CREATE PROCEDURE 语句来显示。
3.存储过程体 存储过程体包含了在过程调用的时候必须执行的语句,这个部分总是以BEGIN 开始,以END 结束。当然,当存储过程体中只有一个SQL 语句时可以省略BEGIN-END 标志。
在MySQL 中,服务器处理语句的时候是以分号为结束标志的。但是在创建存储过程的时候,存储过程体中可能包含多个SQL 语句,每个SQL 语句都是以分号为结尾的,这时服务器处理程序的时候遇到第一个分号就会认为程序结束,这肯定是不行的。所以使用“DELIMITER 结束符号”命令将MySQL 语句的结束标志修改为其他符号。最后再使用“OPDELIMITER ;”恢复以分号为结束标志。
【例6.1】用存储过程实现删除一个特定学生的信息。
delimiter $$
110
create procedure  delete_student(in xh char(6))
begin
delete from xs where 学号=xh;
end $$
delimiter ;
当调用这个存储过程时,MySQL根据提供的参数xh的值,删除对应在xs表中的数据。调用存储过程的命令是CALL命令,后面6.1.4节会讲到。
6.1.2 存储过程体
在存储过程体中可以使用所有的SQL语句类型,包括所有的DLL、DCL和DML语句。当然,过程式语句也是允许的。其中也包括变量的定义和赋值。
1.局部变量
在存储过程中可以声明局部变量,它们可以用来存储临时结果。
要声明局部变量必须使用DECLARE语句,在声明局部变量的同时也可以对其赋一个初始值,如果不指定默认为NULL,其语法格式如下:
DECLARE 变量名 ... 类型 [
默认值]
例如,声明一个整型变量和两个字符变量。
declare num int(4);
declare str1, str2 varchar(6);
局部变量只能在BEGIN…END语句块中声明,而且必须在存储过程的开头。声明完后,可以在声明它的BEGIN…END语句块中使用该变量,其他语句块中不可以使用
它。在存储过程中也可以声明用户变量。局部变量和用户变量的区别在于:局部变量前
面没有使用@符号,局部变量在其所在的BEGIN…END语句块处理完后就消失了,而
用户变量存在于整个会话当中。
2.使用SET语句赋值
要给局部变量赋值可以使用SET语句,SET语句也是SQL本身的一部分,其语法格式如下:SET  变量名 = expr [, 变量名 = expr] ...
例如,在存储过程中给局部变量赋值。
set num=1, str1= 'hello';
3.INTO语句
使用这个SELECT…INTO语句可以把选定的列值直接存储到变量中。因此,返回的结果只能有一行,其
语法格式如下:
SELECT 列名[,...] INTO 变量名[,...]  table_expr
其中:table_expr是SELECT语句中的FROM子句及后面的部分。
【例6.2】在存储过程体中,将xs表中的学号为“081101”的学生姓名和专业名的值分别赋给变量name和project。语句如下:
select 姓名,专业名 into name, project
from
xs;
where
学号= '081101';

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。