LIMIT в хранимых процедурах

Обсуждение возникших проблем, предложений и ошибок dbForge для MySQL
Ответить
leshayashin
Сообщения: 1
Зарегистрирован: Сб 03 дек 2011 14:37

LIMIT в хранимых процедурах

Сообщение leshayashin » Сб 03 дек 2011 14:45

Добрый вечер.
Хранимая процедура имеет входной параметр P_LIMIT INT

При использовании этого параметра в процедуре выходит ошибка при сохранении:

SELECT * FROM TABLE1 LIMIT P_LIMIT;

В чем проблема?

Alexander
Devart Team
Сообщения: 1246
Зарегистрирован: Ср 02 ноя 2011 11:32

Сообщение Alexander » Пн 05 дек 2011 10:38

Здравствуйте.

Нам не удалось воспроизвести данную проблему.
Не могли бы Вы прислать скрипт данной процедуры и текст ошибки? А также сообщить версии MySQL Server и продукта dbForge Studio for MySQL.

Габриэль
Сообщения: 74
Зарегистрирован: Ср 24 мар 2010 10:08
Откуда: Москва

Сообщение Габриэль » Сб 24 дек 2011 00:24

Alexander писал(а):Здравствуйте.

Нам не удалось воспроизвести данную проблему.
Не могли бы Вы прислать скрипт данной процедуры и текст ошибки? А также сообщить версии MySQL Server и продукта dbForge Studio for MySQL.
Почему же, всё понятно: человек хочет управлять количеством сканируемых записей в большой таблице и присылает LIMIT с переменной.
Дело не dbForge Studio, а в самом MySQL. Если я не ошибаюсь и за 2-3 года ничего не изменилось, то параметр типа LIMIT в SQL-запросах всегда должен быть константой, и это даже где-то написано в материалах по MySQL. Действительно, это крайне неудобно, но пока приходится мириться с этим и как-то изворачиваться, например, загружать больщую таблицу в несколько более мелких и читать оттуда последовательно... Или выгружать в несколько XML файлов данных к себе на компьютер...

Габриэль
Сообщения: 74
Зарегистрирован: Ср 24 мар 2010 10:08
Откуда: Москва

Re: LIMIT в хранимых процедурах

Сообщение Габриэль » Сб 24 дек 2011 01:00

leshayashin писал(а):Добрый вечер.
Хранимая процедура имеет входной параметр P_LIMIT INT

При использовании этого параметра в процедуре выходит ошибка при сохранении:

SELECT * FROM TABLE1 LIMIT P_LIMIT;

В чем проблема?
Т.к. в компилятор СУБД должна прийти константа, т.е. в самой хранимой процедуре должно быть после LIMIT вполне определённое число или диапазон чисел, а не переменная, то советую отказаться от принципов (не вообще - Боже упаси! - а только в данном случае) и написать в основной программе на этот раз не вызов процедуры, а весь запрос в виде текста (т.е. cmd.CommandType = CommandType.Text), вместе с LIMIT и Вашей переменной. Тогда СУБД получит готовый запрос, в котором переменная будет уже заменена на её значение. Должно получиться, успеха!

.jp
Devart Team
Сообщения: 379
Зарегистрирован: Ср 09 сен 2009 07:54
Откуда: devart
Контактная информация:

Сообщение .jp » Пн 26 дек 2011 14:25

to leshayashin
Ошибка не воспроизводится на сервере MySQL 5.5.11.
Сообщите точное сообщение об ошибке, а также укажите версию Вашего MySQL сервера, и конечно же версию dbForge Studio for MySQL.

Габриэль
Сообщения: 74
Зарегистрирован: Ср 24 мар 2010 10:08
Откуда: Москва

Сообщение Габриэль » Вс 15 янв 2012 15:16

.jp писал(а):to leshayashin
Ошибка не воспроизводится на сервере MySQL 5.5.11.
Сообщите точное сообщение об ошибке, а также укажите версию Вашего MySQL сервера, и конечно же версию dbForge Studio for MySQL.
Лёша Яшин, наверное, уже и сам разобрался, если столько времени не отвечает. А я пользуюсь версией MySQL 5.0, и проблем с воспроизведением ошибки не возникло, т.е. дело в том, что СУБД должна получать LIMIT в виде константы.
Сообщите, пожалуйста, неужели в версии 5.5, т.е. вообще в MySQL теперь можно использовать переменный LIMIT в хранимых процедурах?!

Ответить