Mysql 如果条件在存储过程中不起作用
我想运行一个存储过程,前提是它满足IF条件,但这个条件一直失败。它总是返回错误。在我的数据库中,@count_log应该返回0。如果我硬编码@count_log等于0,它就会工作。下面是我的代码。请问有什么问题Mysql 如果条件在存储过程中不起作用,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我想运行一个存储过程,前提是它满足IF条件,但这个条件一直失败。它总是返回错误。在我的数据库中,@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; decla
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
如果
这对于每一行都是正确的,所以只要日志中有任何记录,就从日志中选择COUNT*,其中logId=logId将返回大于0的值
您的意思可能是将表的列与传递的同名参数进行比较。尝试用表名限定其中一个。由于参数优先,这意味着限定的一个解析为表列,另一个解析为参数
(SELECT COUNT(*) FROM Logs WHERE Logs.logId = logID)
或者重命名参数
(SELECT COUNT(*) FROM Logs WHERE Logs.logId = logID)
有关优先级的详细信息,请参见:
例程参数优先于表列。
您的参数名称与@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;
您是否尝试打印@count_log值,如果是,则返回什么?