10-存储过程和存储函数
基础
概念
-
MySQL的存储过程和存储函数是一种保存在数据库服务器上、可以用来执行特定工作的一组SQL代码的程序段。存储过程和存储函数可以包含针对数据库操作的SQL语句,还可以在其内部进行流程控制,而且执行速度快,所以在数据库应用开发中广泛使用。
-
MySQL的存储过程和存储函数的语法非常接近,但也是有区别的,主要如下:
- 存储过程的参数可以有IN,OUT,INOUT三种类型;而存储函数只能有IN类型。
- 存储过程声明时不需要返回类型;而存储函数声明时需要描述返回类型,且存储函数体中必须包含一个通过RETURN语句的返回值。
- 存储过程中的语句功能更强大,可以实现很复杂的业务逻辑;而存储函数则有很多限制,也就是说,存储函数实现的功能针对性比较强。
- 存储过程可以调用存储函数;而存储函数不能调用存储过程。
- 存储过程一般是作为一个独立的部分来执行(使用CALL语句调用);而存储函数可以作为查询语句的一个部分来使用。
优点:
- 存储过程和存储函数允许标准组件式编程,提高了SQL语句的重用性、共享性和可移植性。
- 存储过程和存储函数是在MySQL服务器上执行的,执行速度快、网络通信流量小。
- 存储过程和存储函数可以作为一种安全机制来利用,其权限可以与数据表的权限不同,保证数据的安全性。
存储过程
创建
-
不带参数
- 语法
CREATE PROCEDURE <存储过程名> ( )[characteristic …]<存储过程体>
说明:characteristic参数指定存储过程的特性,其主要取值及说明如下:
[NOT] DETERMINISTIC:指定DETERMINISTIC 的优化器是否开启,默认选项为NOT DETERMINISTIC。
CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA:指定子程序使用SQL语句的限制,默认指定为CONTAINS SQL。
SQL SECURITY {DEFINER | INVOKER}:指定谁有权限来执行,默认指定为DEFINER。
COMMENT ‘string’:注释信息。
<存储过程体>是SQL代码的内容,可以用BEGIN…END来标志SQL代码的开始和结束。-
示例:
- 创建一个不带有参数的存储过程up_softwareStudent,查询出“软件131”班级中的所有学生记录。
-
带参数:
- 语法:
CREATE PROCEDURE <存储过程名> ([参数1[,参数2[,…[,参数n]]]])[characteristic …]<存储过程体>
说明:
<参数>的格式为:[IN | OUT | INOUT ] <参数名> <类型>。
IN表示输入参数;OUT表示输出参数;INOUT表示既可以是输入、也可以是输出参数。
<参数名>表示存储过程的参数名称。
<类型>表示存储过程的参数类型,可以是MySQL数据库的任意数据类型。-
示例:
- 创建一个带有输入参数的存储过程up_deptStudentInfo,通过一个给定的班级,查询出该班级中的所有学生记录。
- 创建一个带有输入和输出参数的存储过程up_scoreGradeInfo,通过一个给定的学号,查询出该学生选修课程的数量及平均分,并通过输出参数返回。
执行存储过程
- 存储过程是存储在服务器端的SQL语句的集合,要使用这些已经定义好的存储过程,就必须通过调用的方式来实现。存储过程被调用后,数据库系统将执行存储过程中的语句。执行存储过程需要拥有EXECUTE权限。
- 调用存储过程使用CALL语句,其语法格式如下:
CALL <存储过程名>([<实际参数值1>[, 实际参数值2….]])