DB2 9 使用开发(733 考试)认证指南,第 2 局部: DB2 数据垄断(4)

进修根底概念
developerWorks








在 SQL 法度中何时使用游标

什么是游标?何时须要游标?

游标(cursor)是用于垄断 DB2 盘问前去的多行了局集的一种机制。 在以下两种形状下,须要使用游标:

  • 盘问前去不止一行。
    含 INTO 子句的 SELECT 语句很随意马虎编写,可是这种语句只容许前去一行。在一条 SELECT 语句中不存在容许直接处置多个行的子句,所以必须使用游标。

  • 当您想要更新或删除一个或多个行,可是首先须要反省它们的内容时,须要使用游标。
    更新或删除行的最庞大的方式是使用像上面如许的语句:

    UPDATE staff SET salary = salary * 1.10 WHERE id = 100

    或者
    DELETE FROM staff WHERE id = 100

    但是,这些叫做 searched 更新或删除的语句,在更新或删除之前不容许法度反省行的内容。这时可以思量使用一个游标,连合使用一条 positioned 更新或删除语句。后一种方式也称 Update Where Current Of 和 Delete Where Current Of,其中 Current Of 是指游标以后所处在的行。

要使用游标,首先必须声明它,然后翻开它,接着从中获取行,每次只能获取一行,再(可选地)更新或删除游标所处在的那一行,最后关闭该游标。在本节和前面的大节中,可以看到更多细节和例子。





回页首



游标支持怎样随 DB2 接口而变

游标支持和术语会因 DB2 编程接口的差别而差别。让我们简略地看一下这些差别点。然后,在 垄断游标 大节中,还可以看到嵌入式 SQL 的一些例子。

对游标的根底支持是由 SQL 言语本身经过议定 DECLARE CURSOROPENFETCHCLOSE 语句供给的。

经过议定以下语法,可以实验 positioned 更新和删除:

UPDATE [OR DELETE] ... WHERE CURRENT OF <CURSOR NAME>


差其它接口以差其它体式名目创设 SQL 游标支持。传统编程言语,比如 C、C 和 COBOL,支持在静态和静态嵌入式 SQL 中显式地声明和使用游标。在这些言语中,能单向地一次一行地对行遏制处置。

SQL 过程言语对游标的支持异常类似于 C,不外它增添了 WITH RETURN 子句,以支持将了局集前去给存储过程的调用者。

在 DB2 CLI 中,游标不是显式地声明的,当调用 SQLExecute()SQLExecDirect() 函数时,CLI 主动创设游标。在游标支持的基础上,CLI 供给了附加的功用,比如向后滚动的功用,一次检索一组行的功用,以及按多行向前移动的功用。

在 JDBC 中,游标是在创设 ResultSet 对象时主动创设的。JDBC 也供给了类似于 CLI 的附加功用。

SQLJ 的游标支持理论上是 JDBC 和 SQL 中游标支持的混合体,可是在 SQLJ 中,游标的平等物被称作迭代器(iterator)

一些交互式对象,比如 DB2 Command Line Processor (CLP) 和 Control Center,不容许直接使用游标。可是,这些对象本身会使用游标。当经过议定 CLP 实验一条 SELECT 语句时,或者在 Control Center 中向一个表恳求样本内容时,都要使用游标来前去行。





回页首



一个庞大的例子:游标在静态嵌入式 SQL 中的使用

在更深化地商洽游标之前,首先看看静态嵌入式 SQL(一个 C 法度)中的一个异常庞大的游标。

EXEC SQL DECLARE C0 CURSOR FOR SELECT DEPTNUMB, DEPTNAME FROM ORG;
EXEC SQL OPEN C0;
EXEC SQL FETCH C0 INTO :DEPTNUMB, :DEPTNAME;
WHILE (SQLCA.SQLCODE != 100)  /* CONTINUE UNTIL THE END OF THE RESULT SET */
{
PRINTF("    � %-14S\N", DEPTNUMB, DEPTNAME);
EXEC SQL FETCH C0 INTO :DEPTNUMB, :DEPTNAME;
}
EXEC SQL CLOSE C0;


这段代码打印 org 表中每个局部的编号和称号。DECLARE CURSOR 语句供给所使用的盘问,OPEN 语句筹办盘问的了局集。FETCH 语句反复地用于将了局会集各列的值移到法度变量中,一次移一行,直到抵达了局集的开头处 (SQLCODE = 100),此时游标关闭。




版权声明: 原创作品,容许转载,转载时请务必以超链接方式标明文章 原始因由 、作者信息和本声明。否则将穷究法例责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1972870.html