您的位置:首页 > 其它

DB2 9 使用拓荒(733 检讨)认证指南,第 2 部分: DB2 数据操作(6)

2011-03-06 23:51 417 查看
学习根柢根底观观点









操作游标

游标措置概述

在本节中,您将更进一步看到若安在嵌入式 SQL 使用次第中运用游标。异常,根柢根底的步骤照旧是声明、翻开、获取、更新/删除(可选)和封闭。

为了赞助看法游标的观观点,假定 DB2 构建一个了局表来寄存经过议定
SELECT
语句检索到的全数行。游标经过议定标识或指向表中的当前行,使使用次第可以会见了局表中的行。当运用游标时,使用次第可以继续地从了局表中检索每一行,直到碰到 end-of-data 条件(也即是
NOT FOUND
条件、
SQLCODE  100
SQLSTATE 02000
)。取决于满足搜刮条件的行的数目,尝试
SELECT
语句失失落的了局集概略包括 0 行、1 行或更多的行。

在嵌入式 SQL 中声明游标

DECLARE CURSOR
语句的语法很是简朴。上面是静态 SQL 的一个例子:

DECLARE C1 CURSOR FOR SELECT * FROM STAFF


这条语句的运用概略有点令人隐晦,因为这条语句不是可尝试的。换句话说,这条语句是在嵌入式使用次第的预备阶段措置的,在次第尝试时代,当碰到
DECLARE
语句时,不会发生任何事件。全数事情都是在游标翻开后完成的。专心的要求即是,在源文件中,
DECLARE CURSOR
语句要出现在
OPEN
语句之前。而在异常的 C 函数中,乃至不需求放入如许的语句。在游标声明时地点的源文件中,每个游标的称呼必需是专心的。

假设运用静态 SQL,那么
DECLARE CURSOR
语句会有有所不同。这里不再运用
SELECT
语句的语法,而是运用一个语句名。这个语句名必需与预备相关的
SELECT
语句时指定的称呼相婚配。比方:

EXEC SQL PREPARE STMT1 FROM :STRINGSTMT;
EXEC SQL DECLARE C3 CURSOR FOR STMT1;










回页首

在嵌入式 SQL 中翻开游标

经过议定翻开一个游标,可以预备究诘了局会合的行,以供次第运用。open 利用还使游标的职位处所处于第一个了局行之前,不外只要尝试 fetch 下令时,才气会见那一行。

每每,open 利用将占去究诘尝试进程中的年夜部分时间,尤其是在有
ORDER BY
GROUP BY
子句的环境下就更是云云。

OPEN
语句的语法很是简朴。要翻开一个名为 c0 的游标,可运用以下语句:

OPEN C0










回页首

在嵌入式 SQL 中获取游标

对游标尝试 fetch 将招致了局会合的下一行变成对次第可用,每每是将了局集各列中的值放入到宿主变量中。了局会合的第 n 列的值被放入 fetch 语句中的第 n 个宿主变量中。

比方,假设为
Select name, dept, id from staff
声明一个游标
c0
,那么语句
Fetch c0 into :hv1, :hv2, :hv3
将把
name
列的值放入
hv1
,把
dept
列的值放入
hv2
,把
id
列的值放入
hv3


假设了局集列可觉无暇,那么应该再运用一个宿主标识符(null 指示符),DB2 将把一个负值存储在谁人变量中,以暗示前去的是一个 null 值。比方,将之前的例子改为
Fetch c0 into :hv1, :hv2 :hv2ind, :hv3
,如许次第就可以晓得员工的部分能否为 null。

每每,会将 fetch 语句放在一个次第轮回中,该轮回直到
SQLCODE
为 100 时才终了。此时,了局会合全数的行都已被获取。









回页首

用游标更新和删除行

如前所述,可以对游标所指向的行进行 positioned 更新或删除。在更新或删除之前,必需尝试一条 fetch 语句,并且前去的
SQLCODE
不克不及为 100(或一个错误)。了局会合的每一行都可以以这种体例进行措置。上面是一个例子:

EXEC SQL DECLARE CURSOR C0 FOR SELECT NAME, SALARY FROM STAFF FOR UPDATE OF DEPT;
EXEC SQL FETCH C0 INTO :HVNAME, :HVSAL;
/* THERE MIGHT BE PROGRAM LOGIC HERE TO CHECK THE EMPLOYEE NAME AND SALARY */
/* AND ONLY EXECUTE THE UPDATE IF SOME CRITERIA APPLY                      */
EXEC SQL UPDATE STAFF SET DEPT = :NEWDEPT WHERE CURRENT OF C0;


该代码从 STAFF 表中检索雇员信息,并批准更新雇员的部分。
DECLARE CURSOR
语句提供究诘,其中列出
name
salary
列作为被检索的列,并指出某些行中的
dept
列可以更新。
FETCH
语句将雇员和薪水值放入次第变量中。
UPDATE
语句用于将之前获取的行中
dept
列的值更新为次第变量
newdept
中的值。

固然这里没有浮现,但每每要运用次第逻辑控制轮回,使轮回在达到了局集的最初时终了,并且只更新某些行。









回页首

封闭游标

封闭游标可以释放游标的内部存储,并使游标不再可用。封闭游标的语法很是简朴:

CLOSE C0


默许环境下,封闭一个游标并不会释放它所持有的锁。要释放锁,还需添加
WITH RELEASE
子句:

CLOSE C0 WITH RELEASE


这使得 DB2 检讨检讨释放全数的读锁。可是,DB2 将保存用于更新行的锁,并且概略需求为其他利用或交互保存一些读锁。

当游标处于翻开形态时,可以在任何时分封闭它。也即是说,在封闭游标前,不需求获取整个了局集。游标封闭后,还可以再次翻开,就像之前没有被运用过一样。

版权声明:
原创作品,批准转载,转载时请务必以超链接体式格式标明文章 原始理由 、作者信息和本声明。否则将清查轨则责任。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐