• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            一個反映DB2 游標的經(jīng)典問題

            Posted on 2010-03-18 22:56 Prayer 閱讀(490) 評論(0)  編輯 收藏 引用 所屬分類: DB2

                本文中的存儲過程示例,預計的循環(huán)次數(shù)是yh表行數(shù),由于SELECT IID INTO PINT FROM YH WHERE 0=1;不返回任何行,所以at_end后會立刻等于1(只循環(huán)一次就退出)。
             

            DECLARE  at_end  INT  DEFAULT  0; 
            DECLARE PIID INTEGER DEFAULT 0 ;
            DECLARE PINT INTEGER DEFAULT 0 ;
            DECLARE  not_found  CONDITION  FOR  SQLSTATE  '02000';
            --DECLARE PCOUNT INTEGER;
            DECLARE  c1  CURSOR  FOR   
            SELECT IID FROM YH; 
            DECLARE  CONTINUE  HANDLER  FOR  not_found 
            SET  at_end  1; 
            OPEN  c1; 
            SET PCOUNT=0;
            ins_loop:
            LOOP 
            FETCH  c1  INTO  PIID; 
            IF  at_end  <>0    THEN 
            LEAVE  ins_loop; 
            END  IF; 
            SET PCOUNT=PCOUNT+1;
            SELECT IID INTO PINT FROM YH WHERE 0=1;
            END LOOP;

             

            http://www.souzz.net/html/database/DB2/69884.html

             

            CREATE PROCEDURE bump_salary_iftest (IN deptnumber SMALLINT)
            LANGUAGE SQL
            BEGIN
              DECLARE SQLSTATE CHAR(5);
              DECLARE v_salary DOUBLE;
              DECLARE v_years SMALLINT;
              DECLARE v_id SMALLINT;
              DECLARE at_end INT DEFAULT 0;
              DECLARE not_found CONDITION FOR SQLSTATE '02000';

              DECLARE C1 CURSOR FOR
                SELECT id, CAST(salary AS DOUBLE), years
                FROM staff;
              DECLARE CONTINUE HANDLER FOR not_found
                SET at_end = 1;

              OPEN C1;
              FETCH C1 INTO v_id, v_salary, v_years;
              WHILE at_end = 0 DO

                  UPDATE staff
                    SET salary = 2150 * v_years
                    WHERE id = -1;

                FETCH C1 INTO v_id, v_salary, v_years;
              END WHILE;
              CLOSE C1;
            END

            請問,我想讓這個循環(huán)執(zhí)行完,但是由于SET salary = 2150 * v_years
                    WHERE id = -1 更新的數(shù)據(jù)為0條,at_end變量就被置為1,從而導程序跳出循環(huán),我如何做,能夠及時更新數(shù)據(jù)為0行
            ,而循環(huán)還能繼續(xù)下去呢,請高手指點
                                                                          


            解決方案:

            可以先計算循環(huán)次數(shù),根據(jù)這個數(shù)值進行循環(huán) :

            CREATE  PROCEDURE  bump_salary_iftest(IN deptnumber SMALLINT,out iReturn int)
            LANGUAGE  SQL
            BEGIN
                  DECLARE  SQLSTATE  CHAR(5);
                  DECLARE  v_salary  DOUBLE;
                  DECLARE  v_years  SMALLINT;
                  DECLARE  v_id  SMALLINT;
                  DECLARE  at_end  INT  DEFAULT  0;
                  DECLARE  not_found  CONDITION  FOR  SQLSTATE  '02000';
                 
                  Declare  v_temp int;

                  DECLARE  C1  CURSOR  FOR
                      SELECT  id,  CAST(salary  AS  DOUBLE),  years
                      FROM  staff;
                  DECLARE  CONTINUE  HANDLER  FOR  not_found
                      SET  at_end  1;
                     
                  -- get the loop number
              select count(*) into v_temp from staff;
              set iReturn =0;
                  OPEN  C1;
                  FETCH  C1  INTO  v_id,  v_salary,  v_years;
                  WHILE  v_temp>0  DO
                        -- out the iReturn to check the result
            set iReturn =iReturn+1;
                        UPDATE  staff
                              SET  salary  2150  v_years
                              WHERE  id  -1;
                      FETCH  C1  INTO  v_id,  v_salary,  v_years;
                      set v_temp = v_temp-1;
                  END  WHILE;
                  CLOSE  C1;
            END@
             
             
            http://topic.csdn.net/u/20071214/14/2c93b395-76c6-4a9d-b017-6733562edcfa.html

            久久精品国产亚洲av麻豆小说| 精品99久久aaa一级毛片| 一级做a爰片久久毛片免费陪| 久久91这里精品国产2020| 四虎影视久久久免费观看| 囯产精品久久久久久久久蜜桃| 亚洲色大成网站www久久九| 国产91色综合久久免费| 青草久久久国产线免观| 精品国产乱码久久久久久1区2区| 久久不见久久见免费影院www日本| 精品伊人久久大线蕉色首页| 97久久精品人人做人人爽| 亚洲午夜无码久久久久| 久久久受www免费人成| 99久久精品日本一区二区免费| 久久久国产亚洲精品| 狠狠色丁香婷综合久久| 青草国产精品久久久久久| 无码人妻久久一区二区三区蜜桃| 久久精品国产亚洲av水果派| 狠狠色丁香久久婷婷综合图片| 久久av免费天堂小草播放| 国产精品免费福利久久| 亚洲成色WWW久久网站| 香蕉久久久久久狠狠色| 久久精品国产第一区二区| 国产叼嘿久久精品久久| 久久综合九色综合久99| 久久国产乱子伦精品免费强| 天天躁日日躁狠狠久久| 亚洲国产欧美国产综合久久| 国产精品中文久久久久久久| 久久久久亚洲精品中文字幕| 久久毛片免费看一区二区三区| 九九久久精品国产| 欧美亚洲另类久久综合婷婷| 亚洲精品乱码久久久久久蜜桃| 亚洲精品tv久久久久| 精品久久久无码人妻中文字幕| 91麻豆国产精品91久久久|