Maria DB 存储过程不返回任何内容

问题描述 投票:0回答:1

当我调用这个存储过程时:

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;关闭材料_光标;一切都很好。

但是我需要对光标返回的数字进行计算。

为了完成这项工作我还缺少什么?

mariadb
1个回答
0
投票

您收到的错误是在没有更多行时调用 FETCH 导致的。

您应该设置一个处理程序来捕获此事件并设置完成:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
© www.soinside.com 2019 - 2024. All rights reserved.