存储过程在数据库课程教学中的讲解

2015-07-09 13:36常志东
中国信息技术教育 2015年10期
关键词:触发器语句应用程序

常志东

数据库技术在软件开发中应用广泛,存储过程又是数据库课程教学中的重点和难点。教师在可以结合日常事物来讲授存储过程相关的知识点。

使用“组装工具”概念引入存储过程

在讲解中,教师可向学生举例,在日常生活中存在这样一种工具,该工具经常会被用到,但是它是由几个零件组装而成。如果将工具提前组装好,需要时直接取出使用,就能极大地提高工作效率,同时也能杜绝因为错误组装造成工作失误。而存储过程就是数据库技术中数据处理的这样一个工具,它是由流程控制语句和SQL语句书写的过程组成,经编译和优化后存储在数据库服务器中以完成特定功能,可以被其他程序调用,用于执行频繁使用的查询、业务规则和其他过程使用的公共例行程序。概念中“流程控制语句、SQL语句”是组件,“编译、优化”是组装,“数据库、服务器”是其存储位置,“被其他程序调用、频繁使用”是其应用场合。

使用“可变组装工具”概念来介绍带参数的存储过程

而在介绍带参数的存储过程时,教师可以举例假设,在保持工具基础不变的情况下,通过调整若干个组件型号的方式来迎合不同的工作对象,这样就让组装工具更加灵活、应用更加广泛,如多用螺丝刀,不同型号的钻头针对不同的螺丝。带参数的存储过程就类似于“多用螺丝刀”,参数就是钻头工具包。参数名是数据表中的字段名,参数值也就是字段对应的、存在于数据表中的值。理解起来就是:钻头必须是螺丝刀的组件,且用到的型号必须存在于工具包中。

结合家用电器的自动调节功能引入触发器

教师在针对触发器的讲解时应明确,触发器包含了存储过程这种工具的基本特性,另外还具备特有的功能。我们知道“电冰箱、空调、洗衣机”等家用电器在满足一定设定条件后才能够完成自动调节功能。触发器就与这些家用电器相似,需要满足一定条件才能触发,从而执行指定操作。例如,电冰箱“达到设定温度”是条件,“停机”是触发结果。触发器创建语法中“insert,update,delete,drop,alter”等关键字就是触发条件,“as”关键字之后的内容就是触发后执行的操作,即触发结果。

案例

下面笔者以“学生成绩管理系统”开发为例,通过实例演示来讲解存储过程的应用。取出数据库中学生基本信息、课程信息、学生成绩三个表,详细信息如下:

学生基本信息表(student):学号(stuno)、姓名(stuname)、班级(class)、状态(state);课程信息表(course):课程号(couno)、课程名(couname);学生成绩表(results):学号(stuno)、课程号(couno)、成绩(score)、状态(state)。三个表之间通过主外键建立数据关系。(注:仅用于方法说明需要)

1.学生成绩查询功能

学生根据学号查询自己的成绩,实现

的SQL语句为:“selectstuname,class,couname,score from student a,course b,results c where a.stuno=c.stuno and b.couno=c.couno and a.stuno=@stuno”@stuno为学号变量。

当不使用存储过程时,是在应用端直接为学号变量赋值后将SQL语句提交给数据库服务器,数据库服务器执行SQL语句,在数据库中找到这些表以及相应的字段后将查询结果返回给应用端这个过程极其浪费时间和资源,违背程序设计的原则。

在使用存储过程时,首先在数据库服务器上创建名为checkresult的存储过程,SQL语句如下:

create procedure checkresult

@stuno nvarchar(30)--定义学号变量,针对不同学号学生查询

as

select stuname,class,couname,score from student a,course b,results c where a.stuno=c.stuno and b.couno=c.couno and a.stuno=@stuno

go

这样checkresult存储过程就被存储于数据库服务器上,形成一个组装工具,并且可以更换不同型号的组件;存储过程执行结果会以一个虚拟表的形式存在于数据库服务器上。

在应用程序端,调用存储过程:“declare @xh nvarchar(30) set @xh=`应用程序中对应的学号变量值`execute checkresult @xh go”,就可以直接从虚拟表中查询数据,速度快,效率高。

2.学生休学功能

学生申请休学后,将基本信息表中的状态字段(state)修改为休学,同时学生成绩表中对应该学生的成绩状态修改为不可查。SQL语句为:“update student set state='休学` where stuno=@stuno”、“update results set state='不可查` where stuno=@stuno”,在应用程序端,先执行第一段SQL语句,再执行第二段,就可以实现该功能。不过这样需要与数据库服务器有两次交互,并且必须保证第一段SQL语句正确执行,否则就会造成数据一致性出错。另外,如果学生成绩表中无该生成绩,应用程序还可能报错,这样在应用程序端就需要增加验错功能,给程序员增加了工作量,也同时增加了数据库服务器和应用程序服务器的负担。

在使用触发器时,在数据库服务器端创建触发器suspend,针对学生基本信息表的“修改”操作触发后,针对学生成绩表的状态字段进行自动修改。SQL语句如下:

create trigger suspend

on student--执行修改操作的数据表

after update

as

update results set state='不可查'where stuno=(select stuno from deleted)

go

deleted表是建在数据库服务器的内存中,由系统管理的逻辑表,对于修改记录(update)操作,deleted表里存放的是修改前的记录(修改完成后即被删除);对于删除记录(delete)操作,deleted表里存放的是被删除的旧记录。

创建完成后,在应用程序端只需要设计修改学生基本信息表中状态字段的程序,只要SQL语句正确执行,就会触发对学生成绩表的修改操作。整个过程数据库服务器与应用程序服务器只需要一次交互即可,并且很好地解决了成绩表中记录为空时出错的问题。

猜你喜欢
触发器语句应用程序
配置触发器有条件启动Windows服务
基于Multisim14.0的双D触发器应用与仿真
删除Win10中自带的应用程序
触发器在酒店管理系统中的应用
谷歌禁止加密货币应用程序
基本算法语句
我喜欢
三星电子将开设应用程序下载商店
作文语句实录
微软软件商店开始接受应用程序