数据库原理:存储过程和存储函数

在大型数据库系统中,存储过程(Stored Procedure)和存储函数(Stored Function)具有很重要的作用。无论是存储过程还是存储函数,都是由一些SQL语句和流程控制语句构成的集合,它们可以被应用程序、触发器或另一个存储过程所调用,执行后能完成预先设定的功能。

存储过程和存储函数能避免开发人员重复地编写相同的SQL代码。存储过程和存储函数编写完成后,系统进行预编译,并在MySQL服务器中存储和执行。存储过程和存储函数具有执行速度快、提高系统性能、安全性高等优点。

本章将介绍存储过程与存储通数的有关概念、特点,以及创建、使用、查看、修改和删除存储过程与存储函数的方法。同时,本章将结合存储过程与存储函数,介绍MySQL编程基础知识,包括常用系统函数、变量、运算符、表达式和流程控制语句等。另外,本章还将讲解游标的概念、特点,以及如何利用游标访问记录集中的数据等。

本章学习目标:掌握存储过程与存储函数的概念,理解它们的优点和区别;掌握与MySQL编程相关的基础要素和语法要求;掌握存储过程和存储函数的创建、调用、查看、修改、删除的方法与操作步骤;理解存储过程和存储函数的参数类型与区别,以及调用时参数传递的类型与传递机理;掌握游标的概念;理解游标的工作机理;掌握游标的使用方法,包括定义游标、打开游标、提取数据和关闭游标等。

一、MySQL存储过程与存储函数

1.1、存储过程与存储函数概述

1.1.1、存储过程

存储过程是能完成特定功能的SQL代码段,经编译后存储在数据库中,可被触发器、其他存储过程、程序设计语言所调用。

每个存储过程在定义时被指定为一个特定的名称,即存储过程的名称,因此,用户可通过指定存储过程的名称并给出参数(如果该存储过程带有参数)来调用执行指定的存储过程。

存储过程的功能由其过程体中的代码来决定,过程体由BEGIN……END语句所指定,相关代码写在该语句的内部,当存储过程被调用执行时,过程体中的代码将被执行,从而完成了相应的功能。

MySQL中的存储过程与其他编译语言中的过程类似,比如,可以接受输入参数并以输出参数的形式将多个值返回至调用过程,存储过程的执行能够完成某个预先设定的功能等。

1.1.2、存储函数

存储函数(自定义函数)与存储过程一样,也是由一组SQL语句和一些特殊的控制结构语句组成的代码段,但存储函数经过执行、运算,能通过RETURN语句返回一个函数值,因此,用户可以将经常需要使用的计算操作或功能写成一个存储函数。

与存储过程的过程体类似,存储函数的功能由其函数体中的代码来决定,函数体也由BEGIN……END语句所指定,函数体中的代码写在该语句的内部,当函数被调用执行时,函数体中的代码将被执行,从而完成了相应的功能。

本质上,存储函数与MySQL内部函数性质相同,所不同的是,存储函数是用户自定义的,而MySQL内部函数是系统预先定义好的。

1.2、存储过程的优点

存储过程具有以下优点。

(1)具有很强的灵活性,功能强大。存储过程中可用流程控制语句对SQL语句的执行进行控制,这使存储过程具有很强的灵活性,可以完成复杂的判断和较复杂的运算。

(2)便于被多次重复调用。创建好的存储过程被存储在其隶属的数据库中,用户在应用程序中可以多次调用,而不必重新编写存储过程的SQL语句。同时,数据库编程技术人员可随时对存储过程进行修改,但对应用程序没有影响,因为存储过程独立于程序源代码而单独存在,不影响客户端的使用。

(3)能实现更快的执行速度。如果实现某一操作需要若干条SQL语句,这些语句放在存储过程中执行要比作为一个批处理执行速度快得多,因为存储过程是预编译的,存储过程在创建时,MySQL就对其进行编译、分析和优化,并且给出最终被存储在系统表中的执行计划。在第一次被执行后,存储过程就存储在服务器的内存中,这样客户端应用程序在执行时就可以直接调用内存中的语句执行,无须再次进行编译,这就大大加快了执行速度。而这些SQL语句作为批处理执行时,每次都要从客户端重复发送,并且在MySQL每次执行这些语句时,都要对其进行编译和优化,速度相对较慢。

(4)减少网络流量。如果完成某一操作的SQL语句被组织到一个存储过程中,那么在客户端上调用该存储过程时,只需要一条调用该存储过程的语句就可实现,网络中传送的只是调用语句,而不需要在网络中传送这些SQL语句,从而大大降低了网络流量。

(5)存储过程可作为一种安全机制来利用。DBA可设定只有某用户才具有对指定存储过程的使用权,从而实现对相应数据访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全性。

1.3、存储过程与存储函数的比较

从语法上看,存储过程、存储函数是十分相似的。我们甚至可以说,存储函数就是一种特别的存储过程。但是,它们之间还是有一些区别的,如表15~1所示。

存储过程 存储函数
参数可以有IN、OUT、INOUT3种类型 参数只有IN类型
需要用CALL语句调用存储过程,即将存储过程作为一个独立的部分来执行 不需要CALL语句,可以直接调用存储函数,存储函数可以作为查询语句的一个部分来调用
过程体中不允许包含RETURN语句,不能有返回值,但可以通过OUT参数带回多个值 函数体中必须包含一条有效的RETURN语句,有且只有一个返回值,如单个值或者表对象
存储过程可以调用存储函数 存储函数不能调用存储过程
主要用于执行并完成某个功能操作 主要用于计算并返回一个函数值

二、MySQL编程基础

在前面的学习过程中,我们所用到的SOL语句是关系型数据库系统的标准语句,标准的SQL语句几乎可以在所有的关系型数据库系统上不加修改地使用。但是,标准的SQL语句不支持流程控制,仅仅是一些简单的语句,使用起来有时不方便,也很难实现满足要求的更复杂的功能。为此,大型的关系型数据库系统都在标准SQL语句的基础上,结合自身的特点推出了可以编程的、结构化的SQL编程语言。例如,SQL Server的Transact-SQL、Oracle的PL/SQL等。MySQL也引入了程序设计思想、相关编程语句、扩展语句等,利用这些语句,用户可以按照逻辑写出由若干条语句组成的程序代码(即MySQL脚本),从而实现更为复杂的数据库操作。编写的脚本代码可以保存在.sql文件中。

MySQL脚本编程中的要素主有包括注释、定界符、语句块、变量、运算符、表达式、流程控制语句等。

2.1、注释、定界符与语句块

2.1.1、注释

2.1.2、定界符与DELIMITER命令

2.1.3、语句块与BEGIN···END语句

2.2、变量的定义和使用

2.2.1、用户会话变量

2.2.2、局部变量

2.2.3、系统变量

2.3、运算符与表达式

2.3.1、算术运算符与算术表达式

2.3.2、比较运算符与关系表达式

2.3.3、逻辑运算符与逻辑表达式

2.3.4、位运算符及其表达式

2.3.5、运算符的优先级

2.4、流程控制语句

2.4.1、IF语句

2.4.2、CASE语句

2.4.3、WHILE语句

2.4.4、REPEAT语句

2.4.5、LOOP语句

2.4.6、LEAVE语句和ITEATE语句

三、MySQL常用内置函数

3.1、数学函数

3.2、字符串函数

3.3、日期和时间函数

3.4、系统信息函数

3.5、聚合与统计函数

3.6、加密函数

3.7、其他函数

3.7.1、控制流函数

3.7.2、数据类型转换函数

四、MySQL存储过程的使用

4.1、创建存储过程

4.2、调用存储过程

4.3、查看存储过程

4.4、修改存储过程

4.5、删除存储过程

4.6、存储过程的参数

五、MySQL用户自定义函数

5.1、创建函数

5.2、调用自定义函数

5.3、函数的维护管理

六、游标的使用

用SELECT语句从数据库中检索数据后,结果被放在内存的一个区域中,查询结果往往是一个含有多个记录的集合(结果集),数据库编程人员常常需要对结果集中的记录逐条进行访问处理,游标机制就是可以解决此类问题的主要方法。

游标实际上是一种能从包括多条记录的结果集中逐条访问这些记录的机制。MySQL服务器会专门为游标开辟一定的内存空间,用以存放游标操作的结果集,同时游标的使用会使系统根据具体情况对某些数据进行封锁。游标能够实现允许用户访问单独的数据行,而不是只对整个结果集进行操作。

游标主要包括结果集和游标位置两部分,游标结果集是定义游标的SELECT语句的结果集,游标位置(游标指针)则是指向这个结果集中的某一行的指针。

实质上,游标位置充当了记录指针的作用,某一时刻指向结果集中的某一行。第一次打开标时,游标指针指向结果集的第一条记录,使用游标每从结果集中取出一条记录后,指针自动移动一条记录,指向下一条记录。利用游标,可以对结果集中的每一条记录顺序地从前向后逐条进行遍历,以便进行相应的操作。

MySQL游标只能用于存储过程和存储函数。游标的使用过程和顺序为:声明游标、打开游标、从结果集中提取数据、关闭游标。

6.1、声明游标

6.2、打开游标

6.3、从结果集中提取数据

6.4、关闭游标

七、小结

本章是MySQL编程中的重要内容,重点讲解了以下几个方面的内容。

(1)本章详细介绍了在MySQL编程过程中常用的编程要素,包括变量、内置函数、运算符、表达式及流程控制语句等,应用这些要素,用户可以在存储过程、存储函数、视图等对象中进行编程,实现较为复杂的功能。

(2)本章介绍了存储过程和存储函数的概念、特点及区别,并采用编写语句和利用MySQL Workbench的功能菜单两种方法,详细讲解了存储过程与存储函数的定义、调用、查看、修改、删除等的具体方法。

(3)本章详细讲解了游标的概念、原理和特点,以及如何在编程过程中进行游标的声明打开、提取数据和关闭。

八、参考

《数据库原理及应用教程(MySQL版)》

《数据库系统原理 自考04735》


数据库原理:存储过程和存储函数
https://kuberxy.github.io/2024/07/21/数据库原理11:存储过程和存储函数/
作者
Mr.x
发布于
2024年7月21日
许可协议