Задавайте вопросы, мы ответим
Вы не зашли.
Подскажите пожалуйста.
Не могу понять, маны прозрения не дают
делаю так:
if @a = 1 then set @query2 = concat(@query2,',date'); end if;
Выдает синтаксическую ошибку 1064.
Я новичек в Mysql, сильно не пинайте.
Спасибо.
Неактивен
Такая конструкция применима только в хранимых процедурах и функциях.
В запросе можно использовать функцию if()
select if(2>1,'Истина','Фантастика');
Неактивен
Спасибо ..
И eще вопрос
Под Windows использую Workbench.
Создал из того что я писал процедуру ...
Ошибка с if пропала.
Вот только теперь не могу понять как запустить процедуру )))
Все от моей неопытности ...
Неактивен
Да это уже читал.
Решил применить if в запросе, а не в процедуре.
Делаю так:
select @a := if(@b=1,concat(@a,',id As ID Client'),@a) As test;
В результате переменная @a принимает нужное значение, но результат select выводится в таблицу и не отрабатывает следующий select где мне нужно использовать свою переменную @a.
Понимаю что мои вопросы банальны, но все же подскажите как правильно присвоить значение переменной по условию if, для дальнейшего использования этой переменной в следующем select.
Цель применить select который покажет нужные мне столбцы, отображать столбец или нет я выбираю флагом
set @id_visible = '1';
если @id_visible=1 к осномному запросу select date,user добавится id, будет так select date,user,id.
Вот тут я при помощи if и хочу проверять @id_visible.
Опять же не пинайте, я начинающий ....
Неактивен
Кол-во выбираемых столбцов должно быть определено до запроса. Для формирования нужного вам запроса вы можете использовать подготовленные выражения. Но тогда для анализа переменной @id_visible вам придется использовать конструкцию if..end if, т.е. писать хранимую процедуру.
В вашем случае вы можете схитрить и обойтись одним запросом
select date, if(@id_visible=1, concat(user,'++',id), user) from `table`;
но потом вам придется разбивать полученную информацию.
Лучше честно написать хранимую процедуру, а не использовать костыли.
Неактивен
vasya написал:
Кол-во выбираемых столбцов должно быть определено до запроса. Для формирования нужного вам запроса вы можете использовать подготовленные выражения. Но тогда для анализа переменной @id_visible вам придется использовать конструкцию if..end if, т.е. писать хранимую процедуру.
Именно это мне и нужно сделать, подготовленные выражения, уже работают (вывожу необходимый минимум столбцов), а вот добавить к ним по флагу, пока не получается...
В вашем случае вы можете схитрить и обойтись одним запросом
select date, if(@id_visible=1, concat(user,'++',id), user) from `table`;
Не много не понял как это мне поможет ?
По поводу хранимой процедуры...
Делаю так:
delimiter // CREATE PROCEDURE client () BEGIN declare date1,date2 DATETIME; ...... set date1 = '2010-11-27 00:00:00'; set date2 = '2010-11-27 23:59:59'; set id_visible = '1'; ..... set query1 = 'select'; set query2 = ' .....'; set query3 = ' from ......'; set query = concat(query1, query2, query3); if id_ = 1 then set query2 = concat(query2,',id As ID Client'); end if; prepare result from query; execute result; END; //
При попытке выполнить получаю "Cannot load from mysql.proc. The table is probably corrupted"
Не исключено что сам сервер, как то не донастроен ...
Запрос тестирую из Mysql Workbench под виндой, а сервер Mysql стоит на unix, т.е. по сети.
Может тут какие поблемы ?
Неактивен
kharkov_max написал:
В вашем случае вы можете схитрить и обойтись одним запросом
select date, if(@id_visible=1, concat(user,'++',id), user) from `table`;Не много не понял как это мне поможет ?
При @id_visible=1 вы получите информацию об id. Но в дальнейшем придется разбивать полученную строку, чтобы выделить данные об юзере и id. Так что метод плохой.
kharkov_max написал:
По поводу хранимой процедуры...
Делаю так:Код:
delimiter // CREATE PROCEDURE client () BEGIN declare date1,date2 DATETIME; ...... set date1 = '2010-11-27 00:00:00'; set date2 = '2010-11-27 23:59:59'; set id_visible = '1'; ..... set query1 = 'select'; set query2 = ' .....'; set query3 = ' from ......'; set query = concat(query1, query2, query3); if id_ = 1 then set query2 = concat(query2,',id As ID Client'); end if; prepare result from query; execute result; END; //
Вы сначала определяете query, из которого делаете подготовленное выражение, а потом изменяете query2, которое используется при определении query. Но query то уже определен.
Попробуйте отдельно выполнить запрос:
SELECT id As ID Client FROM `имя таблицы`;
kharkov_max написал:
При попытке выполнить получаю "Cannot load from mysql.proc. The table is probably corrupted"
Не исключено что сам сервер, как то не донастроен ...
Запрос тестирую из Mysql Workbench под виндой, а сервер Mysql стоит на unix, т.е. по сети.
Может тут какие поблемы ?
Попробуйте
Неактивен
Вы сначала определяете query, из которого делаете подготовленное выражение, а потом изменяете query2, которое используется при определении query. Но query то уже определен.
Попробуйте отдельно выполнить запрос:
SELECT id As ID Client FROM `имя таблицы`;
Спасибо, поправлю.
Попробуйте
check table mysql.proc;
Обновлялась ли версия MySQL? Если да, то с какой на какую?
Результат запроса:
mysql> check table mysql.proc; +------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------+-------+----------+----------+ | mysql.proc | check | status | OK | +------------+-------+----------+----------+ 1 row in set (0.08 sec)
Т.е. вродк все нормально.
Изначально был Mysql 5.1, потом он переехал на 5.5, и дальше в процессе появления новых портов обновлялся.
На данный момент Mysql 5.5.7-rc.
Неактивен
Спасибо...
mysql_upgrade дообновил сервер.
Теперь могу создать и сохранить в базе мою хранимую процедуру. Сервер больше не ругается.
Помогите пожалуйста добить запуск процедуры до конца.
Делаю так:
delimiter // CREATE PROCEDURE client () BEGIN declare date1,date2 DATETIME; ...... set date1 = '2010-11-27 00:00:00'; set date2 = '2010-11-27 23:59:59'; set id_visible = '1'; ..... set query1 = 'select'; set query2 = ' .....'; set query3 = ' from ......'; if id_ = 1 then set query2 = concat(query2,',id As ID Client'); end if; set query = concat(query1, query2, query3); prepare result from @query; execute result; END;// call client();
В результате при попытке выполнить этот код из хранимой процедуры, получаю ответ консоли "PROCEDURE client already exists".
Понимаю что я как то не так запускаю, подскажите как правильно...
Это моя первая процедура в Mysql .......
Неактивен
Вы хотите создать процедуру client (), но у вас уже сеть процедура с таким именем. Старую нужно сначала удалить.
Неактивен
vasya написал:
Вы хотите создать процедуру client (), но у вас уже сеть процедура с таким именем. Старую нужно сначала удалить.
Да, я понял свою ошибку.
Удалил старую процедуру и создал новую.
Подскажите далее.
Скажем процедура уже есть.
Правильно ли я пытаюсь ее вызвать
call client();
При таком вызове, в консоли query получаю ответ:
Thread stack overrun: 4752 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld --thread_stack=#' to specify a bigger stack.
Я так понимаю что серверу не хватает памяти ?
Которую необходимо выделить дополнительно в настройках сервера ...
Неактивен
Это всё мэйнтейнеры дебиан, которые притащили настройки 5.0 в 5.1
Можно просто закомментировать thread_stack, значения по умолчанию
должно хватить.
Неактивен
vasya написал:
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_thread_stack
Я увеличил этот параметр, в настройках сервера, вроде все нормально, но как у новичка вылезли новые грабли.
Сейчас запуск моей процедуры говорит о синтаксической ошибке, пытаюсь понять что не так ...
Неактивен
У меня есть подозрение что я не верно вызываю процедуру.
Так правильно ?
call client();
В результате хочу на экран получить таблицу с данными из процедуры client()
Неактивен
Вызываете правильно.
Приведите сообщение об ошибке полностью.
Неактивен
Ошибка:
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 'NULL' at line 1
Неактивен
prepare result from @query;
Строчкой выше вы определяете переменную query, а в подготовленном выражении используете @query, которая не определена, т.е. имеет значение NULL.
Неактивен
vasya написал:
prepare result from @query;
Строчкой выше вы определяете переменную query, а в подготовленном выражении используете @query, которая не определена, т.е. имеет значение NULL.
Подправил:
set @query = concat(query1, query2, query3); prepare result from @query; execute result;
Ошибка та же.
Еще подскажите, есть ли какой то более нормальный метод тестирования процедур?
Я сейчас запускаю код, с созданием процедуры, потом запускаю саму процедуру call ...
Если ошибка, то мне приходится удалять созданную процедуру и создавать заново ...
Неактивен
К сожалению, иного метода тестирования процедур пока нет.
Приведите полностью текст вашей процедуры.
P.S. А ещё лучше сделайте простейшую процедуру, которая лишь состовляет подготовленное выражение и запускает его и постепенно усложняйте её, чтобы отловить ошибку.
Неактивен
vasya написал:
К сожалению, иного метода тестирования процедур пока нет.
Приведите полностью текст вашей процедуры.
P.S. А ещё лучше сделайте простейшую процедуру, которая лишь состовляет подготовленное выражение и запускает его и постепенно усложняйте её, чтобы отловить ошибку.
Нашел логическую ошибку
Есть такой кусок
select ... from .. date_time between @date1 and @date2 and id_client like @ip';
Вот тут то и ругается ...
Как правильно в такой выборке указать between @date1 and @date2 and
Неактивен
Так как указано правильно, за исключением апострофа после ip.
Неактивен
Апостороф это конец текстовой строки, это правильно.
Сейчас я сделел так:
select ... from id_client like @ip and date_time between @date1 and @date2';
И все работает.
Но не могу понять как вставить конструкцию date_time between @date1 and @date2 не в конец from а к примеру в начало или в середину.
Неактивен