snippetsqlModerate
How to use prepared statements within MySQL stored procedures?
Viewed 0 times
storedproceduresstatementswithinpreparedmysqlhowuse
Problem
I'm using mysql and I need to somehow use the column curid returned by the prepared statement in the later query. I use prepared statements because as I've read, it is the only way to pass a variable to the LIMIT clause. I have this stored procedure here:
This does not work - I'm not sure how to pass the curid.
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;
|This does not work - I'm not sure how to pass the curid.
Solution
The solution was to SET the variable in the prepared statement itself as in:
SET @sql = CONCAT('SET @curid = SELECT id
FROM coupon_operations
WHERE user_id = ?
ORDER BY id ASC
LIMIT ?, 1');Code Snippets
SET @sql = CONCAT('SET @curid = SELECT id
FROM coupon_operations
WHERE user_id = ?
ORDER BY id ASC
LIMIT ?, 1');Context
StackExchange Database Administrators Q#1935, answer score: 11
Revisions (0)
No revisions yet.