mysql 存儲過程中游標遇到的問題

在mysql的存儲過程中,我們常根據需要使用遊標處理數據。並使用

DECLARE CONTINUE HANDLER FOR NOT FOUND  SET nextdo =1;

來處理遊標結束時跳出循環體。但在今天的使用中發現,如果在循環中,存在select xxx into xxx這樣的語句時,如果沒有查詢到值,nextdo會被設置成1,導致遊標不能繼續循環下去。所以在select xxx into xxx這樣的語句後面要使用下面的語句。把變量重置爲0。以保證遊標可以繼續執行。

IF _BottlePackCode IS NOT NULL THEN 
   UPDATE  acexeym_packcode.code SET status=_status  
         WHERE ParentCode=_PackCode ;
ELSE
    SET nextdo=0;#如果上面條件沒有找到,程序會的將nextdo設置爲1
END IF;

另外,在select xxx into xxx這樣的語句之前,一定要把變量重置爲null,否則當沒有獲取到值into時,程序仍會取到上一個已經賦值的變量.

下面是該存儲過程的完整代碼 

CREATE PROCEDURE temp_async_order_bottlepackcode(_orderid bigint)
    BEGIN 
      DECLARE _PackCode nvarchar(50);
      DECLARE _CompanyId bigint;
      DECLARE _status bigint;
      DECLARE _batchno nvarchar(50);
      DECLARE _ProductId bigint;
      DECLARE _skuid bigint;    
      DECLARE _UpdateTime datetime;
      DECLARE _RelationEvent nvarchar(300);
      DECLARE _BatchNoId bigint;
      DECLARE _ActiveTime datetime;
  
      DECLARE _BottlePackCode nvarchar(50);
      DECLARE nextdo tinyint default 0;

      #獲取激活了的瓶碼
      DECLARE  mycursor CURSOR FOR   
          SELECT a.PackCode,a.CompanyId,a.status,a.batchno,a.ProductId,a.skuid,a.UpdateTime,a.RelationEvent,a.BatchNoId,a.ActiveTime
            FROM acexeym_packcode.code a 
            WHERE  orderid=_orderid AND a.ActiveTime IS NOT NULL;
      DECLARE CONTINUE HANDLER FOR NOT FOUND  SET nextdo =1;
  

      OPEN mycursor;
      lbl_read:LOOP
        BEGIN 
           FETCH mycursor 
            INTO    _PackCode ,     _CompanyId ,    _status,     _batchno ,     _ProductId ,     _skuid ,    _UpdateTime ,     _RelationEvent ,     _BatchNoId ,     _ActiveTime;
          IF nextdo =1 THEN
            LEAVE lbl_read;
           END IF; 
          SET _BottlePackCode=NULL;
          SELECT PackCode INTO _BottlePackCode FROM acexeym_packcode.code 
              WHERE ParentCode=_PackCode AND CompanyId=_CompanyId AND substring(Packcode,10,1)='0' AND ActiveTime IS NULL  LIMIT 1;
          IF _BottlePackCode IS NOT NULL THEN 
            UPDATE  acexeym_packcode.code SET status=_status,    batchno= _batchno ,    ProductId= _ProductId ,   
              skuid= _skuid ,    UpdateTime=_UpdateTime ,     RelationEvent=_RelationEvent ,     BatchNoId=_BatchNoId ,   
              ActiveTime=_ActiveTime
              WHERE ParentCode=_PackCode AND CompanyId=_CompanyId ;
          ELSE
            SET nextdo=0;#如果上面條件沒有找到,程序會的將nextdo設置爲1
          END IF;
          END ;
      END LOOP;
    close mycursor;     
  END  //

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章