• <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

            国内精品九九久久久精品| 久久精品国产亚洲AV香蕉| 99久久99这里只有免费费精品 | 久久精品国产99久久久香蕉| 久久久99精品成人片中文字幕| 久久精品中文字幕一区| 欧美精品九九99久久在观看| av无码久久久久久不卡网站| 精品无码久久久久久久久久| 久久久久AV综合网成人| 国产成人精品久久| 人妻无码中文久久久久专区| 深夜久久AAAAA级毛片免费看| 久久久久成人精品无码中文字幕| 国产精品美女久久久久AV福利| 久久无码中文字幕东京热| 欧美精品福利视频一区二区三区久久久精品 | 久久国产香蕉一区精品| 久久人人爽人人爽人人片av麻烦 | 精品视频久久久久| 久久久久久久97| 草草久久久无码国产专区| 亚洲午夜久久久久久久久久| 久久久久久久免费视频| 香港aa三级久久三级| 久久精品a亚洲国产v高清不卡| 久久亚洲国产精品123区| 久久国产精品久久| 99久久精品费精品国产一区二区| 热久久视久久精品18| 久久国产视屏| 国产2021久久精品| 国产一级持黄大片99久久| 亚洲精品无码成人片久久| 欧美喷潮久久久XXXXx| 精品多毛少妇人妻AV免费久久| 久久精品国产亚洲7777| 亚洲国产精品久久| 久久国产精品一区| 久久激情亚洲精品无码?V| 精品久久人人做人人爽综合|