APP下载

数据库中存储过程教学探讨

2019-10-08杨武英冯志鑫

软件 2019年5期
关键词:关系数据库函数

杨武英 冯志鑫

摘  要: 数据库多年来一直是计算机科学中重要的分支,有着十分广泛的应用。各个层次的工科学校都在多数专业里开设了不同种类的数据库课程,根据实际情况的不同一般都会采取适合自己学校的教学方法,对内容有不同方向的侧重。存储过程的应用是数据库应用中重要的一环,如何在教学过程中把握它的难点与重点是一件十分困难的事情。为了解决这个问题,进行了深入的分析探讨,以此来提高存储过程的教学效果。

关键词: 存储过程;数据库编程;函数;关系数据库

中图分类号: G642.4    文献标识码: A    DOI:10.3969/j.issn.1003-6970.2019.05.045

本文著录格式:杨武英,冯志鑫. 数据库中存储过程教学探讨[J]. 软件,2019,40(5):230232

【Abstract】: Database has been an important branch of computer science for many years, and has a very wide range of applications. Engineering schools at all levels have offered different kinds of database courses in most majors. According to the actual situation, they usually adopt teaching methods suitable for their own schools, with different emphasis on content. The application of stored procedure is an important part of database application. How to grasp its difficulties and key points in the teaching process is a very difficult thing. This paper makes an in-depth analysis and discussion of this problem in order to improve the teaching effectiveness of stored procedure.

【Key words】: Stored procedure; Database programming; Function; Relational database

0  引言

如何對数据、特别是规模巨大的数据进行管理一直是计算机应用的重要研究方向,其成果在科研、社会生活、商业应用的各个方面都有着巨大的影响[1]。为了培养合格的数据库[2]技术人才,国内多数大学都开设了数据库类的相关课程。伴随着大数据、云计算时代的到来,各类数据库软件的功能日益强大,用人单位对毕业生的数据库技术水平和实践能力也提出了越来越高的要求,如何更深入浅出地完成数据库的教学工作意义越来越重大[3-4]。

存储过程[5]是数据库编程里极为重要的一环,但也是教学过程中非常难以处理的一环,因为存储过程(Stored Procedure)的定义和性质都是十分模糊不好直观描述的。多数教科书大多直接略过这个,

有的则将其简单描述为一组语句的集合、以整体形式在数据库服务器端执行、经编译后存放在数据库服务器端[6]。这样的描述不仅难以让学生对存储过程产生直观的印象,也和函数的定义显得雷同,这就需要教师对存储过程的相关概念和原理进行深入的分析讲解,并进一步探讨存储过程的优点及适用性,使学生能够更好的理解这一部分的内容。

1  存储过程的实质

存储过程实质上就是能完成一定操作的大型数据库语句模块化的批处理,例如SQL、Oracle中的存储过程,最大的优点是经过服务器的第一次编译后被再次调用时不需要被再次编译,用户通过名字就可以直接调用存储过程,当然了,如果该存储过程带有参数还必须对参数赋值。

在创建存储过程的时候,创建语句书写完毕提交后DBMS会进行保存,但创建过程并没有真的完成。必须等到程序第一次被执行,DBMS对其优化并将查询计划编译后缓存到系统上,整个存储过程才算真的建立。以后再运行存储过程时,系统不必去重新创建一个新的查询计划而是直接使用缓存中的查询计划。有特殊要求时需要通过使用WITH RECOMPILE选项人工指定。这意味着每次使用创建好的存储过程时都会跳过很多优化和编译工作从而节省时间。确切节省的时间量取决于批处理程序的复杂程度、批处理中表的大小、每个表上索引的数量等多个因素。对于简单的任务来说节省的时间往往不可能很多,尤其是在课堂教学实例这种极其简单的任务里,有时甚至会让学生觉得更加麻烦,产生一种效率更低的错觉。但对于大型任务来说,节省的时间就显得十分重要了,即使每次只能节省1秒或更少,但通过百分比可以计算出区别(比如1秒比2秒就快了100%)。特别当需要进行多次调用时或针对循环的情况,这一区别就会变得更加明显。

2  对存储过程和函数进行区分

与存储过程类似,数据库中的函数也是为了可重复执行操作数据库语句的集合,两者虽然有一定的相似性,但是还存在许多不同之处。在课堂上通过对这些区别的分析和总结,使学生可以更好的区分这两个容易混淆的知识点。

(1)标识符不同:函数的标识符为FUNCTION;存储过程为PROCEDURE。

(2)参数的使用不同:存储过程的参数分类比较多,分为输入参数、输出参数、可输入输出的参数[7];而函数只有输入参数这一种形式。

(3)返回值不同:存储过程的返回值,可以有多个值,并且可以返回参数;函数的返回值,只能有一个值,且只能返回表对象或者值,不能返回参数。

(4)调用方式:函数的调用方式单一,而存储过程的调用方式比较灵活,有多种调用方式。

(5)从使用上来说:函数的使用限制比存储过程要多,如不能用临时表、只能用表变量等。

(6)从实现的功能上说:相对简单但针对性比较强的功能利用函数实现比较有优势,而实现比较复杂的功能用存储过程更有优势。

(7)从灵活性上来说:函数多数时候作为查询语句的一个部分来调用,位于FROM关键字的后面,而存储过程一般是作为一个独立的部分来执行。

3  深入分析存储过程的优点

由于多数课本对于存储过程的优点都是简略的一笔带过,这就造成学生不能从这简单的描述里明白存储过程的优点到底在哪里,从而无法激发学习的热情,更不能在编程中充分利用存储过程的这些优点来解决问题。要想达到良好的教学效果,就必须解开学生心中的疑惑,给学生深入的分析存储过程的优点:

(1)存储过程在编程上的独立性

这一点几乎所有的教科书上都没有指出,课内实验因为过于简单也不能体现,极易被忽视,但却是存储过程最重要的优势。其原理是对用户而言,编写应用程序源代码的时候只需要输入存储过程的调用语句即可,并不接触存储过程服务器后台的具体语句。维护数据库的专业人员可随时在后台对存储过程进行修改,只要用于连接的名称和参数不受影响,则对用户的源代码毫无影响,从而极大地提高了程序的可移植性。

(2)使用存储过程能够提高程序的执行效率

如果一个程序的数据库操作包含大量的Transaction-SQL代码或需要被多次执行,那么使用存储过程要比一般的批处理有效率的多。因为批处理只是数据库语句的简单组合,每次被运行时DBMS都要对其重新进行编译和优化,而存储过程的最大特点就是预编译,执行时所有需要的分析、优化都在第一次被执行的时候由查询优化器完成并存在系统表中,以后再被调用时省去了优化这个耗时的步骤执行速度自然很快。

(3)使用存储过程能够节约网络流量

这一点单靠学生自己是很难理解的,因为他们在学校的实验里几乎不可能接触到这一块的,需要老师进行说明。以SQLsever的教学为例,用户程序对数据库对象进行的操作如查询、修改等,每一步都得传输对应的SQL语句来实现[8],而如果将相对固定的操作利用存储过程模块化,那么当用户需要实现这些操作时,只需要一条传输调用该存储过程的语句就可以让DBMS实现所有的这些操作了。当用户数量比较多或者操作步骤比较复杂的时候,需要流量的差距就会十分巨大。

(4)可以利用存储过程提升数据库的安全性

因为存储过程的便利性,很多外部程序中的操作都是利用定义在数据库服务器里的存储过程來运行的,系统管理员在对用户进行角色授权的时候对执行存储过程的权限进行区分,使得只有拥有对应角色的用户才能执行响应的存储过程,减少了非授权用户越过权限对数据进行访问的风险,从而保证数据的安全。

4  探讨存储过程的适用性

存储过程的优点虽然突出,但是局限性也很大,并不是什么地方都适合采用存储过程的,当学生理解了存储过程的优点和使用方法之后,可能会过多的使用存储过程,这时就需要和学生进一步探讨存储过程的适用性,以达到恰当使用的目的。通过和学生进行课堂讨论和举例分析,结论如下:

(1)使用存储过程的程序往往需要专门的数据库开发人员进行维护,但实际情况是用户很难做到这一点。因为多数用户并没有特定的数据库开发人员,而是由普通程序员兼职进行数据库操作的,这些普通程序员往往只会操作程序完成数据访问,没有足够的培训在数据库上进行开发,这就造成了应用上的不方便。

(2)设计逻辑需要变更时,修改存储过程比直接修改SQL语句[9-10]要麻烦的多,所以项目需求如果变动比较频繁时,不建议使用存储过程进行编程。例如大型互联网企业淘宝、知乎、微博等,多用PC服务器支撑,用户量的增速是不可控的,同时在线访问的用户量也是不可控的,这对数据库的压力是非常大的,这就需要把业务逻辑放到其他语言的代码层,从而可以借助一些软硬件上的调配来让负载均衡、平滑Web层的服务器来支持大规模的访问,这种时候如果大量用存储过程编程显然是一件相当冒险的事。

(3)在一些对高效率或者规范性要求比较高的项目编程中,以及一些对于算法要求比较高或者涉及多条数据逻辑的地方,则适用于运用存储过程来解决问题。

5  结论

本文讨论了在教学过程中如何更加深入的探讨存储过程的实质、优点和适用性,并分析了存储过程与函数的区别。这些问题的澄清和解决有助于学生更好的理解存储过程,激发学生对数据库学习的热情。

参考文献

[1] 张义兰, 李大学. FOXBASE数据库及其应用. 复旦大学出版社, 1995.

[2] 萨师煊, 王姗. 数据库系统概论第五版[M]. 北京: 高等教育出版社, 2013.

[3] 陈晓燕, 张鲲. 数据库系统原理课程教学改革探索[J]. 软件, 2018, 39(3): 102-105.

[4] 谷伟, 陈莲君, 徐方勤. 产学模式在《数据库原理》课程教学改革中的应用[J]. 软件, 2012, 33(7): 153-155.

[5] 马垣. 关系数据库理论[M]. 北京: 清华大学出版社, 1999.

[6] 王贺朝. 电子商务与数据库应用. 东南大学出版社, 2002.

[7] 周力. SQL Server 2000实用教程. 大连理工大学出版社, 2009.

[8] 张鲲. 高校计算机专业数据库课程设计教学指导与实践研究[J]. 软件, 2012, 33(2): 84-86.

[9] 刘芬. 关于SQL数据库的性能优化问题的研究[J]. 软件, 2012, 33(6): 139-141.

[10] 何玉洁, 梁琦. 数据库原理与应用(第二版). 北京: 机械工业出版社, 2011.

猜你喜欢

关系数据库函数
关系数据库在高炉数据采集系统中的应用
二次函数
二次函数
函数备考精讲
关系数据库技术在计算机网络设计中的应用
基于索引结构的关系数据库关键词检索
一种基于数据图划分的关系数据库关键词检索方法