Я использую 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;
|
Это не работает - я не уверен, как пройти курид.
CONCAT
в приведенном выше коде?CONCAT
если вы не передаете имя таблицы или что-то в качестве параметра. ех)CONCAT('select * from ', the_table_name, ' where id>100');
Я рад, что вы нашли свой ответ. Другое решение - использовать синтаксис SELECT ... INTO :
источник
Пожалуйста, попробовал это. решить конкатенацию, ПОДГОТОВИТЬ и ВЫПОЛНИТЬ операторы, как показано ниже.
источник