don*_*onk 18 mysql stored-procedures prepared-statement
我正在使用 mysql,我需要以某种方式使用后面查询中准备好的语句返回的列 curid。我使用准备好的语句,因为正如我所读到的,它是将变量传递给 LIMIT 子句的唯一方法。我在这里有这个存储过程:
DROP PROCEDURE IF EXISTS fixbalance;
CREATE PROCEDURE fixbalance (userid INT)
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE balance INT DEFAULT 0;
DECLARE idcnt INT;
SET idcnt = (SELECT COALESCE(COUNT(id), 0)
FROM coupon_operations
WHERE user_id = userid);
IF idcnt <> 0 THEN
WHILE i <= idcnt DO
BEGIN
SET @iter = i;
SET @user_id = userid;
SET @sql = CONCAT('SELECT id AS curid
FROM coupon_operations
WHERE user_id = ?
ORDER BY id ASC
LIMIT ?, 1');
PREPARE stmt FROM @sql;
EXECUTE stmt USING @user_id, @iter;
DEALLOCATE PREPARE stmt;
SET balance = balance + (SELECT points
FROM coupon_operations
WHERE user_id = @user_id
AND id = @curid);
UPDATE coupon_operations SET balance = balance;
SET i = i + 1;
END;
END WHILE;
END IF;
END;
|
Run Code Online (Sandbox Code Playgroud)
这不起作用-我不确定如何传递curid。
don*_*onk 11
解决方案是在准备好的语句本身中设置变量,如下所示:
SET @sql = CONCAT('SET @curid = SELECT id
FROM coupon_operations
WHERE user_id = ?
ORDER BY id ASC
LIMIT ?, 1');
Run Code Online (Sandbox Code Playgroud)
Der*_*ney 10
我很高兴你找到了答案。另一种解决方案是使用SELECT...INTO语法:
SET @sql = CONCAT('SELECT id INTO @curid FROM coupon_operations
WHERE user_id = ?
ORDER BY id ASC
LIMIT ?, 1');
Run Code Online (Sandbox Code Playgroud)