在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 //