Ich verwende mysql und muss irgendwie die Spalte curid verwenden, die von der vorbereiteten Anweisung in der späteren Abfrage zurückgegeben wird. Ich verwende vorbereitete Anweisungen, weil ich gelesen habe, dass dies die einzige Möglichkeit ist, eine Variable an die LIMIT-Klausel zu übergeben. Ich habe diese gespeicherte Prozedur hier:
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;
|
Das funktioniert nicht - ich bin mir nicht sicher, wie ich den Curid überwinden soll.
CONCAT
im obigen Code?CONCAT
sei denn, Sie übergeben den Tabellennamen oder etwas als Parameter. ex)CONCAT('select * from ', the_table_name, ' where id>100');
Ich bin froh, dass du deine Antwort gefunden hast. Eine andere Lösung wäre die Verwendung der SELECT ... INTO- Syntax:
quelle
Bitte versuchen Sie es. Verketten, PREPARE und EXECUTE Anweisungen wie folgt zu lösen ..
quelle