教你快速掌握SQL语言中游标的使用技巧

作者:yashi 时间:2009-01-08 16:24:00 

游标的使用

提到游标这个词,人们想到的是在屏幕上一个闪动的方框,用以指示用户将要输入字符的位置。而在关系型数据库的SQL语言中,游标却有另外的含义,它是存放结果集的数据对象。

为什么要用到游标

在某些PowerBuilder应用程序的开发中,您可能根本用不到游标这样一个对象。因为在其它工具开发中很多需用游标实现的工作,在PowerBuilder中却已有DataWin-dow来代劳了。事实上,DataWindow不仅可以替代游标进行从后台数据库查询多条记录的复杂操作,而且还远不止这些。但是同DataWindow和DataStore相比,游标也有其自身的优点,比如系统资源占用少,操作灵活,可根据需要定义变量类型如全局、实例或局部类型和访问类型如私有或公共等。

游标的操作

使用游标有四种基本的步骤:声明游标、打开游标、提取数据、关闭游标。

声明游标

象使用其它类型的变量一样,使用一个游标之前,首先应当声明它。游标的声明包括两个部分:游标的名称;这个游标所用到的SQL语句。如要声明一个叫作Cus-tomerCursor的游标用以查询地址在北京的客户的姓名、帐号及其余额,您可以编写如下代码:

DECLARE CustomerCursor CURSOR FOR

SELECT acct_no,name,balance

FROM customer

WHERE province="北京";

在游标的声明中有一点值得注意的是,如同其它变量的声明一样,声明游标的这一段代码行是不执行的,您不能将debug时的断点设在这一代码行上,也不能用IF...END IF语句来声明两个同名的游标,如下列的代码就是错误的。

IF Is_prov="北京"THEN

DECLARE CustomerCursor CURSOR FOR

SELECT acct_no,name,balance

FROM customer

WHERE province="北京";

ELSE

DECLARE CustomerCursor CURSOR FOR

SELECT acct_no,name,balance

FROM customer

WHERE province〈〉"北京";

END IF

打开游标

声明了游标后在作其它操作之前,必须打开它。打开游标是执行与其相关的一段SQL语句,例如打开上例声明的一个游标,我们只需键入:

OPEN CustomerCursor;

由于打开游标是对数据库进行一些SQL SELECT的操作,它将耗费一段时间,主要取决于您使用的系统性能和这条语句的复杂程度。如果执行的时间较长,可以考虑将屏幕上显示的鼠标改为hourglass。

提取数据

当用OPEN语句打开了游标并在数据库中执行了查询后,您不能立即利用在查询结果集中的数据。您必须用FETCH语句来取得数据。一条FETCH语句一次可以将一条记录放入程序员指定的变量中。事实上,FETCH语句是游标使用的核心。在DataWindow和DataStore中,执行了Retrieve()函数以后,查询的所有结果全部可以得到;而使用游标,我们只能逐条记录地得到查询结果。

已经声明并打开一个游标后,我们就可以将数据放入任意的变量中。在FETCH语句中您可以指定游标的名称和目标变量的名称。如下例:

FETCH CustmerCur-sor

INTO:ls_acct_no,

:ls_name,

:ll_balance;

从语法上讲,上面所述的就是一条合法的取数据的语句,但是一般我们使用游标却还应当包括其它的部分。正如我们前面所谈到的,游标只能一次从后台数据库中取一条记录,而在多数情况下,我们所想要作的是在数据库中从第一条记录开始提取,一直到结束。所以我们一般要将游标提取数据的语句放在一个循环体内,直至将结果集中的全部数据提取后,跳出循环圈。通过检测SQLCA.SQL-CODE的值,可以得知最后一条FETCH语句是否成功。一般,当SQLCODE值为0时表明一切正常,100表示已经取到了结果集的末尾,而其它值均表明操作出了问题,这样我们可以编写以下的代码:

lb_continue=True

ll_total=0

DO WHILE lb_continue

FETCH CustomerCur-sor

INTO:ls_acct_no,

:ls_name,

:ll_balance;

If sqlca.sqlcode=0 Then

ll_total+=ll_balance

Else

lb_continue=False

End If

LOOP

循环体的结构有多种,这里提到的是最常见的一种。也有的程序员喜爱将一条FETCH语句放在循环体的前面,循环体内再放置另外一条FETCH语句,并检测SQLCA.SQLCODE是否为100。但是这样做,维护时需同时修改两条FETCH语句,稍麻烦了些。

标签:
0
投稿

猜你喜欢

  • pytorch 预训练模型读取修改相关参数的填坑问题

    2021-11-07 01:08:36
  • python使用sessions模拟登录淘宝的方式

    2023-01-09 12:05:25
  • mysql中的int(10)int(20)分别代表什么意思

    2024-01-20 21:31:30
  • CentOS7yum安装PHP7.2的操作方法

    2024-05-22 10:08:38
  • python中的bool数组取反案例

    2023-04-12 07:33:15
  • CSS nuggets CSS金矿

    2009-10-28 18:59:00
  • 编写Vue项目,如何给数组的第一位添加对象数据

    2024-04-10 10:34:43
  • SQL Server 2008中有关XML的新功能

    2008-06-04 12:57:00
  • Python实现简单的获取图片爬虫功能示例

    2023-01-31 06:15:13
  • Python实现的json文件读取及中文乱码显示问题解决方法

    2022-05-18 16:41:15
  • python 专题九 Mysql数据库编程基础知识

    2024-01-19 23:06:04
  • [翻译]标记语言和样式手册 Chapter 9 精简标签

    2008-02-01 09:55:00
  • 如何更优雅地写python代码

    2022-03-03 04:53:24
  • Win7 x64 IIS运行ASP+Access故障完美解决方法(转)

    2012-03-27 18:30:35
  • 详解Go中gin框架如何实现带颜色日志

    2024-05-21 10:19:11
  • Python3.7实现中控考勤机自动连接

    2022-08-07 16:24:22
  • Python利用turtle库绘制彩虹代码示例

    2022-03-04 03:55:01
  • SQL Server数据库日志清除的两个方法

    2009-01-08 13:44:00
  • 垂直对齐:vertical-align属性

    2008-07-11 20:55:00
  • python实现图像全景拼接

    2023-05-08 13:29:24
  • asp之家 网络编程 m.aspxhome.com