Používám mysql a musím nějak použít sloupec curid vrácený připraveným příkazem v pozdějším dotazu. Používám připravená prohlášení, protože jak jsem četl, je to jediný způsob, jak předat proměnnou klauzuli LIMIT. Mám tu uloženou proceduru:
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;
|
To nefunguje - nejsem si jistý, jak předat curid.
Řešením bylo nastavení proměnné v samotném připraveném příkazu jako v:
SET @sql = CONCAT('SET @curid = SELECT id
FROM coupon_operations
WHERE user_id = ?
ORDER BY id ASC
LIMIT ?, 1');
Jsem rád, že jste našli svou odpověď. Dalším řešením by bylo použití syntaxe SELECT ... INTO :
SET @sql = CONCAT('SELECT id INTO @curid FROM coupon_operations
WHERE user_id = ?
ORDER BY id ASC
LIMIT ?, 1');
Zkuste to prosím. řešit zřetězené, PREPARE a EXECUTE příkazy níže.
CREATE DEFINER=`products`@`localhost` PROCEDURE `generateMeritList`(
IN `mastercategory_id` INT(11),
IN `masterschools_id` INT(11)
)
NO SQL
begin
declare total int default 0;
declare conditions varchar(255) default '';
declare finalQuery varchar(60000) default '';
if mastercategory_id > 0 THEN
SET conditions = CONCAT(' and app.masterschools_id = ', mastercategory_id);
end if;
SET @finalQuery = CONCAT(
"SELECT * FROM applications app INNER JOIN masterschools school ON school.id = app.masterschools_id
WHERE
(app.status = 'active'", conditions, " LIMIT ",total);
PREPARE stmt FROM @finalQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
end