摘要:显式光标又称为用户自定义光标,通过用户对光标自行定义来解决PL/SQL程序中查询返回多行的问题。该文主要介绍作者在Oracle显式光标应用的教学过程中的举例,讨论了相关例子的缺陷并提出解决的方法。
关键词:Oracle;显式光标;数据库技术
中图分类号:TP393 文献标识码:A文章编号:1009-3044(2012)30-7148-02
Oracle使用一个称为Private SQL Area的工作区执行SQL语句,以保存语句执行结果和相关的状态信息。对于PL/SQL程序中查询返回多行的问题,Oracle采用光标来解决。光标是一个可以命名的缓冲区,用于保存查询语句返回的多行数据。程序通过光标名可以访问光标区的内容。光标有两种类型,分别是隐式光标(系统预定义光标)和显式光标(用户自定义光标)。隐式光标的光标名为SQL,该光标区内主要保存执行SQL语句的一些状态信息或者统计信息,通过光标的几个属性可以访问到这些信息。比如SQL%FOUND,查询最近执行的DML语句是否对相关记录进行了处理,如果有,返回一个逻辑值真,否则返回为假;SQL%ROWCOUNT,可以查询最近执行的一条SQL语句对多少条记录进行了处理。因为隐式光标是数据库管理系统预先定义,因此在操作过程中存在无法与实际问题完全相对应,不够灵活等问题。为了解决上述问题,Oracle提供了显式光标让用户可以对光标自行定义。
1 前级知识
要完全掌握光标的定义方法并将其应用于实际问题的解决,首先要掌握关系数据库的标准语言SQL。SQL语言包括了查询、数据修改、定义、控制和管理等内容,是一种功能全面的关系数据库语言,有一个国际标准,各个数据库厂家在该标准的基础上做不同的扩充;其次,为了提高SQL语言数据处理的效率且支持复杂问题的处理,Oracle系统对SQL语言进行了扩充,其过程化的扩充部分称为PL/SQL,是Oracle系统的核心编程语言。
2 应用举例
介绍显式光标应用经常用到一个例子,编写一个程序来为职工涨工资。程序要达到的要求是:从最低工资涨,每人涨10%,工资总额限制在50万元以内,如果所有职工都涨了一遍,工资总额还没到50万元,也到此为止,最后将新的工资总额和涨了工资的职工人数输出。程序如下:
3 缺陷分析和解决方法
职工的人数和原先工资总额将导致上述程序出现三种结果。第一种情况:还没开始给职工涨工资就发现工资总额已经超过或等于50万,此时程序将不会进入循环体而是直接将涨工资职工人数为0和原来的工资总额输入到msg表中并提交事务;第二种情况:当所有职工都涨了工资,但工资总额还是没有到达50万,程序完成任务并结束;在上述两种情况下,程序都能发挥正常的作用。第三种情况:只有部分职工涨了工资,工资总额就达到或者超过了50万,此时程序就会导致错误的结果。当轮到某位职工涨工资,此时工资总额还没达到50万,程序进入循环体,该职工的工资上涨了10%,然后计算新的工资总额并将涨工资职工人数加1,退出循环体并再次判断工资总额是否达到或者超过50万时,发现新的工资总额已经达到或者超过了50万,于是将涨工资职工人数和工资总额输入到msg表中并结束整个程序。显而易见,最后工资总额达到或者超过了50万,违背了原先的设计要求。导致错误结果的原因在于先给职工涨工资,然后才计算新的工资总额。因此解决的方法是先计算某位职工涨工资的情况下,新的工资总额是否小于50万。如果是,则涨该职工的工资,如果否,则不涨该职工的工资并提交事务。完善后的程序如下:
4 结束语
虽然在PL/SQL程序中可以采用其它方法替代显式光标,但是使用显式光标显然是解决查询中返回多条记录的最佳方式。如何将显式光标跟PL/SQL程序更好的结合在一起,避免出现漏洞,考验着每一个数据库设计者的技术和经验,也是每一个编程人员应该去不断完善的技能。
参考文献:
[1] 王行言,汤荷美,黄维通. 数据库技术及应用[M].2版.北京:高等教育出版社,2004.
[2] 陈一匡.数据库技术教学心得点滴[J].电脑学习,2009(3):78-79.
[3] 张学琴.基于Oracle数据库的SQL语句优化[J].电脑知识与技术,2010(1):20-25.
[4] 刘佳.浅谈ORACLE数据库中的SQL优化原理与应用[J].科技风,2012(2):77.