SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.10.2010 23:54:37

Retrill
Участник
Зарегистрирован: 09.10.2010
Сообщений: 21

Переменные после LIMIT

Пишу запрос внутри хранимой процедуры, который заканчивается на 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"). Подставляю числа вместо переменных - все работает. Пишу переменные - не хочет. Точно нет ошибки в названии переменной.
Что не так? Что нужно сделать, чтобы заработало так, как нужно?

Неактивен

 

#2 13.10.2010 00:21:49

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Переменные после LIMIT

Переменные после LIMIT нельзя. Используйте prepared statement

http://sqlinfo.ru/forum/viewtopic.php?id=363

Неактивен

 

#3 13.10.2010 00:35:38

Retrill
Участник
Зарегистрирован: 09.10.2010
Сообщений: 21

Re: Переменные после LIMIT

vasya написал:

Переменные после LIMIT нельзя. Используйте prepared statement

http://sqlinfo.ru/forum/viewtopic.php?id=363

Насколько мне известно, MySQL не работает с prepared statement внутри хранимых процедур. Это можно как-то обойти?

Неактивен

 

#4 13.10.2010 01:03:05

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Переменные после LIMIT

Можно, например, прочитать сообщение по указанной ссылке, где приведен пример хранимой процедуры с prepared statement внутри.

Неактивен

 

#5 13.10.2010 13:34:29

Retrill
Участник
Зарегистрирован: 09.10.2010
Сообщений: 21

Re: Переменные после LIMIT

vasya написал:

Можно, например, прочитать сообщение по указанной ссылке, где приведен пример хранимой процедуры с prepared statement внутри.

Спасибо что указали на ссылку, как-то в первый раз я ее не отразил.

Я пробовал раньше так, как указано, и, действительно, работало. Однако приведу два возможных кода, один рабочий (из примера), другой нет (пример редактированный, который я хочу):

Первый (глобальная переменная @var):


DROP PROCEDURE IF EXISTS my_proc;
CREATE PROCEDURE my_proc(table_name CHAR(64), column_name CHAR(64))
    BEGIN
        SET @var = CONCAT('SELECT count(DISTINCT ', column_name, ') FROM ', table_name);
        PREPARE zxc FROM @var;
        EXECUTE zxc;
    END;
 


Второй (локальная переменная 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. Переменную не так объявил что ли?

Неактивен

 

#6 13.10.2010 13:46:39

Retrill
Участник
Зарегистрирован: 09.10.2010
Сообщений: 21

Re: Переменные после LIMIT

Вот еще нерабочий пример (ошибка синтаксиса):


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;
 


Нижележащий (рабочий) как-то тупо смотрится:

DROP PROCEDURE IF EXISTS my_proc;
CREATE PROCEDURE my_proc(my_user_id INT)
    BEGIN
        SET @user_id=my_user_id;
        PREPARE zxc FROM 'SELECT * FROM users WHERE user_id=?';
        EXECUTE zxc USING @user_id;
    END;
 

Отредактированно Retrill (13.10.2010 14:04:49)

Неактивен

 

#7 13.10.2010 17:44:54

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Переменные после LIMIT

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;
 

Parameter values can be supplied only by user variables, and the USING clause must name exactly as many variables as the number of parameter markers in the statement.



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.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson