学习根柢根底观观点
操作游标
游标措置概述
在本节中,您将更进一步看到若安在嵌入式 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 将保存用于更新行的锁,并且概略需求为其他利用或交互保存一些读锁。
当游标处于翻开形态时,可以在任何时分封闭它。也即是说,在封闭游标前,不需求获取整个了局集。游标封闭后,还可以再次翻开,就像之前没有被运用过一样。
版权声明:
原创作品,批准转载,转载时请务必以超链接体式格式标明文章 原始理由 、作者信息和本声明。否则将清查轨则责任。