当我调用这个存储过程时:
CREATE PROCEDURE AGBBeta.TestReturnOptions(IN pOptionsID INT, IN pQty Int, IN pUserId INT,
OUT outParam NVARCHAR(3))
BEGIN
DECLARE CalcGlobalCHECK NVarchar(3);
DECLARE done INT DEFAULT FALSE;
DECLARE iMaterialsId INTEGER;
DECLARE iRangesID INTEGER;
DECLARE iSec1 INTEGER;
DECLARE dSQM Decimal(9,2);
DECLARE dSlabQty Decimal(9,2);
DECLARE iMitreLog INTEGER;
DECLARE dSlabOverPrice Decimal(9,2);
DECLARE dPriceOver Decimal(9,2);
DECLARE iOptionsID2 INTEGER;
DECLARE materials_cursor CURSOR FOR
SELECT MaterialsID, RangesID, Sec1, SQM, SlabQty, MitreLog, SlabOverPrice, PriceOver, OptionsID2 FROM AGBBeta.Materials WHERE OptionsID = pOptionsID;
SET CalcGlobalCHECK = '000';
INSERT INTO STORED_PROCEDURED_CHECK(SP_Name, pOptionsID, pQty, pUserId,ValueName,Value)
VALUES ('TestReturnOptions', pOptionsID, pQty, pUserId,'CalcGlobalCHECK_1',CalcGlobalCHECK);
OPEN materials_cursor;
materials_cursor_loop: LOOP
FETCH materials_cursor INTO iMaterialsId, iRangesID, iSec1, dSQM, dSlabQty, iMitreLog, dSlabOverPrice, dPriceOver, iOptionsID2;
IF done THEN
SET CalcGlobalCHECK = '002';
INSERT INTO STORED_PROCEDURED_CHECK(SP_Name, pOptionsID, pQty, pUserId,ValueName,Value)
VALUES ('TestReturnOptions', pOptionsID, pQty, pUserId,'CalcGlobalCHECK_4',CalcGlobalCHECK);
LEAVE materials_cursor_loop;
END IF;
INSERT INTO STORED_PROCEDURED_CHECK(SP_Name, pOptionsID, pQty, pUserId,ValueName,Value)
VALUES ('TestReturnOptions', pOptionsID, pQty, pUserId,'CalcGlobalCHECK_2',CalcGlobalCHECK);
SET CalcGlobalCHECK = '001';
END LOOP materials_cursor_loop;
CLOSE materials_cursor;
INSERT INTO STORED_PROCEDURED_CHECK(SP_Name, pOptionsID, pQty, pUserId,ValueName,Value)
VALUES ('TestReturnOptions', pOptionsID, pQty, pUserId,'CalcGlobalCHECK_3',CalcGlobalCHECK);
SET outParam = CalcGlobalCHECK;
SELECT outParam;
END
通过使用
CALL AGBBeta.TestReturnOptions(26610, 1, 4, @a_message);
我收到此错误
SQL 错误 [1329] [02000]:(conn=358) 没有数据 - 提取、选择或处理零行
如果我检查将值写入其中的表,我可以看到 CalcGlobalCHECK_1 和 CalcGlobalCHECK_2,但看不到其他内容。
如果我删除OPEN Materials_cursor;关闭材料_光标;一切都很好。
但是我需要对光标返回的数字进行计算。
为了完成这项工作我还缺少什么?
您收到的错误是在没有更多行时调用 FETCH 导致的。
您应该设置一个处理程序来捕获此事件并设置完成:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;