zoukankan      html  css  js  c++  java
  • DB2 9 使用拓荒(733 检讨)认证指南,第 2 部分: DB2 数据操作(6)

    学习根柢根底观观点
    developerWorks








    操作游标

    游标措置概述

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

    为了赞助看法游标的观观点,假定 DB2 构建一个了局表来寄存经过议定 SELECT 语句检索到的全数行。游标经过议定标识或指向表中的当前行,使使用次第可以会见了局表中的行。当运用游标时,使用次第可以继续地从了局表中检索每一行,直到碰到 end-of-data 条件(也即是 NOT FOUND 条件、SQLCODE 100SQLSTATE 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 BYGROUP 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 语句提供究诘,其中列出 namesalary 列作为被检索的列,并指出某些行中的 dept 列可以更新。FETCH 语句将雇员和薪水值放入次第变量中。UPDATE 语句用于将之前获取的行中 dept 列的值更新为次第变量 newdept 中的值。

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





    回页首



    封闭游标

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

    CLOSE C0
    


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

    CLOSE C0 WITH RELEASE
    


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

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




    版权声明: 原创作品,批准转载,转载时请务必以超链接体式格式标明文章 原始理由 、作者信息和本声明。否则将清查轨则责任。

  • 相关阅读:
    restful风格
    拦截器(拦截都是控制层的地址。 filter: )
    Springmvc完成ajax功能,controller类返回的数据类型为String且为汉字时出现乱码
    文件上传
    Springmvc完成ajax功能。(jquery. $)
    Controller如何进行重定向跳转
    Maven学习日志一
    SSM整合
    Spring学习日志四
    Spring学习日志三
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1972868.html
Copyright © 2011-2022 走看看