如果条件在存储过程中不起作用

时间:2018-08-01 04:44:16

标签: mysql sql stored-procedures

我想运行一个存储过程,只要它满足IF条件,但此条件会不断失败。它总是返回false。从我的数据库中,@ count_log应该返回0。如果我将@count_log硬编码为等于0,则它可以工作。这是我的下面的代码。请问可能是什么问题?

CREATE DEFINER=`root`@`localhost` PROCEDURE `approve`(IN `userID` INT, IN `logID` INT, OUT `res` INT)
BEGIN
    DECLARE count_log INT;
    declare exit handler for sqlexception
    BEGIN
        -- ERROR 
        rollback;
    END;

    declare exit handler for sqlwarning
    BEGIN
        -- warning -
        rollback;
    END;
        SET @count_log = (SELECT COUNT(*) FROM Logs WHERE logId = logID); 
        -- Confirm has not been treated -- 

        IF(@count_log = 0) THEN

        START transaction;
            -- Update table

        COMMIT;
        SELECT FOUND_ROWS() INTO res;
       END IF;

    END

如果

2 个答案:

答案 0 :(得分:2)

... WHERE logId = logID

每一行都是如此,只要Logs中有任何记录,(SELECT COUNT(*) FROM Logs WHERE logId = logID)就会返回大于0的值。

您应该打算将表的列与传递的同名参数进行比较。尝试使用表名来限定其中之一。由于参数优先,这意味着合格的一个解析为表列,另一个解析为参数。

(SELECT COUNT(*) FROM Logs WHERE Logs.logId = logID)

或重命名参数。

有关优先级的更多信息,请参见"C.1 Restrictions on Stored Programs"

  
      
  • 例程参数优先于表列。
  •   

答案 1 :(得分:2)

您的参数名称与参数名称冲突(如@sticky_bit描述)。只需使用更好的命名约定:

CREATE DEFINER=`root`@`localhost` PROCEDURE `approve`(
    IN in_userID INT,
    IN in_logID INT,
    OUT out_res INT
)
BEGIN
    DECLARE v_count_log INT;
    . . .
    SELECT v_count_log := COUNT(*)
    FROM Logs l
    WHERE l.logId = in_logID; 

    . . .
END;