• <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++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            一個反映DB2 游標的經典問題

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

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

            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

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


            解決方案:

            可以先計算循環次數,根據這個數值進行循環 :

            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

            国产精品久久成人影院| 国产精品久久永久免费| 久久久久国产日韩精品网站| 久久国产精品99精品国产| 一本久久a久久精品综合夜夜| 天天爽天天爽天天片a久久网| 热99re久久国超精品首页| 热久久这里只有精品| 日本加勒比久久精品| 伊人久久大香线蕉综合Av| 国产精品一区二区久久国产| 99久久精品免费看国产免费| 四虎国产精品成人免费久久| 无码人妻精品一区二区三区久久久| 久久AV高清无码| 精品久久久久久亚洲精品| 久久人人爽人爽人人爽av| 亚洲欧美日韩久久精品第一区| 久久99免费视频| 色噜噜狠狠先锋影音久久| 成人综合久久精品色婷婷| 国产精品99精品久久免费| 久久夜色撩人精品国产小说| 久久国产精品成人片免费| 欧美粉嫩小泬久久久久久久| 国产亚洲欧美精品久久久| 色婷婷综合久久久久中文字幕 | 精品国产91久久久久久久a | 久久久久久国产精品免费无码 | 99久久国产综合精品成人影院| 久久久精品波多野结衣| 成人综合伊人五月婷久久| 久久久久久国产精品美女 | 久久se精品一区二区影院| 久久久精品国产sm调教网站| 欧美激情精品久久久久久久九九九| 久久久久久夜精品精品免费啦| 精品久久久久久久久久久久久久久 | 亚洲AV日韩精品久久久久久| 久久久久亚洲AV无码去区首| 久久精品成人国产午夜|