我想运行一个存储过程,只要它满足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
如果
答案 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;