MySQL: подготовка / выполнение в процедуре (concat) - PullRequest
0 голосов
/ 27 февраля 2020

Я немного потерян и надеюсь на вашу помощь. В настоящее время я учусь работать с Mysql, и я получил эту процедуру:

delimiter //
drop procedure price_update2 //
create procedure price_update2()
BEGIN
DECLARE n INT default 0;
DECLARE i INT default 1;
DECLARE cond varchar(255) default '';

SET cond = CONCAT('SELECT customer_id FROM customers LIMIT ',i,',1');
prepare stt FROM cond;
execute stt;
END //

по какой-то причине я всегда получаю сообщение об ошибке рядом с "cond; execute stt ....". Возможно, это просто, но я не могу найти это. Также попытался без concat:

delimiter //
drop procedure price_update2 //
create procedure price_update2()
BEGIN
DECLARE n INT default 0;
DECLARE i INT default 1;
DECLARE cond varchar(255) default '';

SET cond = 'SELECT customer_id FROM customers LIMIT 1';
prepare stt FROM cond;
execute stt;
END //

, если я использую заявление напрямую, оно работает нормально.

1 Ответ

2 голосов
/ 27 февраля 2020

Это странная вещь, но вам нужно использовать определяемые пользователем переменные на данный момент:

delimiter //
drop procedure price_update2 //
create procedure price_update2()
BEGIN
DECLARE n INT default 0;
DECLARE i INT default 1;

SET @cond = CONCAT('SELECT customer_id FROM customers LIMIT ',i,',1');
prepare stt FROM @cond;
execute stt;
DEALLOCATE PREPARE stt; # don't forget to deallocate
END //

В руководстве говорится следующее:

Оператор, подготовленный в контексте хранимой программы, не может ссылаться на параметры хранимой процедуры или функции или локальные переменные, поскольку они go выходят за рамки, когда программа заканчивается, и будут недоступны, если оператор будет выполнен позже вне программа. В качестве обходного пути вместо этого обратитесь к пользовательским переменным, которые также имеют область действия сеанса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...