Задавайте вопросы, мы ответим
Вы не зашли.
Пишу запрос внутри хранимой процедуры, который заканчивается на LIMIT var_1,var_2. Выдает ошибку (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near..."название переменной var_1"). Подставляю числа вместо переменных - все работает. Пишу переменные - не хочет. Точно нет ошибки в названии переменной.
Что не так? Что нужно сделать, чтобы заработало так, как нужно?
Неактивен
Переменные после LIMIT нельзя. Используйте prepared statement
http://sqlinfo.ru/forum/viewtopic.php?id=363
Неактивен
vasya написал:
Переменные после LIMIT нельзя. Используйте prepared statement
http://sqlinfo.ru/forum/viewtopic.php?id=363
Насколько мне известно, MySQL не работает с prepared statement внутри хранимых процедур. Это можно как-то обойти?
Неактивен
Можно, например, прочитать сообщение по указанной ссылке, где приведен пример хранимой процедуры с prepared statement внутри.
Неактивен
vasya написал:
Можно, например, прочитать сообщение по указанной ссылке, где приведен пример хранимой процедуры с prepared statement внутри.
Спасибо что указали на ссылку, как-то в первый раз я ее не отразил.
Я пробовал раньше так, как указано, и, действительно, работало. Однако приведу два возможных кода, один рабочий (из примера), другой нет (пример редактированный, который я хочу):
Первый (глобальная переменная @var):
Неактивен
Вот еще нерабочий пример (ошибка синтаксиса):
Отредактированно Retrill (13.10.2010 14:04:49)
Неактивен
Retrill написал:
Вот еще нерабочий пример (ошибка синтаксиса):
DROP PROCEDURE IF EXISTS my_proc;
CREATE PROCEDURE my_proc(my_user_id INT)
BEGIN
PREPARE zxc FROM 'SELECT * FROM users WHERE user_id=?';
EXECUTE zxc USING my_user_id;
END;
Retrill написал:
Второй (локальная переменная var):
DROP PROCEDURE IF EXISTS my_proc;
CREATE PROCEDURE my_proc(table_name CHAR(64), column_name CHAR(64))
BEGIN
DECLARE var VARCHAR(128);
SET var = CONCAT('SELECT count(DISTINCT ', column_name, ') FROM ', table_name);
PREPARE zxc FROM var;
EXECUTE zxc;
END;
Ведь использование локальной переменной внутри хранимой процедуры всегда предпочтительнее глобальной. Как это сделать? Второй вариант выводит ошибку синтаксиса. Какой-то глюк с использованием prepared statement. Переменную не так объявил что ли?
Это не глюк, потому что:
A prepared statement is also global to the session. If you create a prepared statement within a stored routine, it is not deallocated when the stored routine ends.
Неактивен