SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 28.11.2010 10:00:21

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

If в запросе.

Подскажите пожалуйста.
Не могу понять, маны прозрения не дают

делаю так:

Код:

if @a = 1 then 
    set @query2 = concat(@query2,',date');
end if;

Выдает синтаксическую ошибку 1064.
Я новичек в Mysql, сильно не пинайте.

Спасибо.

Неактивен

 

#2 28.11.2010 10:17:53

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

Re: If в запросе.

Такая конструкция применима только в хранимых процедурах и функциях.

В запросе можно использовать функцию if()
select if(2>1,'Истина','Фантастика');

Неактивен

 

#3 28.11.2010 10:42:51

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: If в запросе.

Спасибо ..

И eще вопрос

Под Windows использую Workbench.
Создал из того что я писал процедуру ...
Ошибка с if пропала.
Вот только теперь не могу понять как запустить процедуру )))

Все от моей неопытности ...

Неактивен

 

#4 28.11.2010 15:52:58

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

Неактивен

 

#5 28.11.2010 18:18:53

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: 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.

Опять же не пинайте, я начинающий ....

Неактивен

 

#6 28.11.2010 18:38:58

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

Re: If в запросе.

Кол-во выбираемых столбцов должно быть определено до запроса. Для формирования нужного вам запроса вы можете использовать подготовленные выражения. Но тогда для анализа переменной @id_visible вам придется использовать конструкцию if..end if, т.е. писать хранимую процедуру.

В вашем случае вы можете схитрить и обойтись одним запросом
select date, if(@id_visible=1, concat(user,'++',id), user) from `table`;
но потом вам придется разбивать полученную информацию.
Лучше честно написать хранимую процедуру, а не использовать костыли.

Неактивен

 

#7 28.11.2010 19:09:33

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: If в запросе.

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, т.е. по сети.
Может тут какие поблемы ?

Неактивен

 

#8 29.11.2010 02:36:50

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

Re: If в запросе.

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, т.е. по сети.
Может тут какие поблемы ?

Попробуйте

check table mysql.proc;

Обновлялась ли версия MySQL? Если да, то с какой на какую?

Неактивен

 

#9 29.11.2010 08:53:06

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: If в запросе.

Вы сначала определяете 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.

Неактивен

 

#10 29.11.2010 10:17:12

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

Re: If в запросе.

Неактивен

 

#11 29.11.2010 12:04:37

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: If в запросе.

Спасибо...
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 .......

Неактивен

 

#12 29.11.2010 12:32:35

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

Re: If в запросе.

Вы хотите создать процедуру client (), но у вас уже сеть процедура с таким именем. Старую нужно сначала удалить.

Неактивен

 

#13 29.11.2010 12:43:06

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: If в запросе.

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.

Я так понимаю что серверу не хватает памяти ?
Которую необходимо выделить дополнительно в настройках сервера ...

Неактивен

 

#14 29.11.2010 12:51:39

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

Неактивен

 

#15 29.11.2010 13:22:15

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: If в запросе.

Это всё мэйнтейнеры дебиан, которые притащили настройки 5.0 в 5.1 smile
Можно просто закомментировать thread_stack, значения по умолчанию
должно хватить.

Неактивен

 

#16 29.11.2010 13:55:24

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: If в запросе.

vasya написал:

http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_thread_stack

Я увеличил этот параметр, в настройках сервера, вроде все нормально, но как у новичка вылезли новые грабли.
Сейчас запуск моей процедуры говорит о синтаксической ошибке, пытаюсь понять что не так ...

Неактивен

 

#17 29.11.2010 13:59:18

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: If в запросе.

У меня есть подозрение что я не верно вызываю процедуру.
Так правильно ?
call client();

В результате хочу на экран получить таблицу с данными из процедуры client()

Неактивен

 

#18 29.11.2010 14:02:26

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

Re: If в запросе.

Вызываете правильно.
Приведите сообщение об ошибке полностью.

Неактивен

 

#19 29.11.2010 14:12:16

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: If в запросе.

Ошибка:

Код:

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

Неактивен

 

#20 29.11.2010 14:28:12

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

Re: If в запросе.

prepare result from @query;

Строчкой выше вы определяете переменную query, а в подготовленном выражении используете @query, которая не определена, т.е. имеет значение NULL.

Неактивен

 

#21 29.11.2010 15:28:50

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: If в запросе.

vasya написал:

prepare result from @query;

Строчкой выше вы определяете переменную query, а в подготовленном выражении используете @query, которая не определена, т.е. имеет значение NULL.

Подправил:

Код:

set @query                      = concat(query1, query2, query3);
prepare result from @query;
execute result;

Ошибка та же.

Еще подскажите, есть ли какой то более нормальный метод тестирования процедур?

Я сейчас запускаю код, с созданием процедуры, потом запускаю саму процедуру call ...
Если ошибка, то мне приходится удалять созданную процедуру и создавать заново ...

Неактивен

 

#22 29.11.2010 15:44:56

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

Re: If в запросе.

К сожалению, иного метода тестирования процедур пока нет.

Приведите полностью текст вашей процедуры.

P.S. А ещё лучше сделайте простейшую процедуру, которая лишь состовляет подготовленное выражение и запускает его и постепенно усложняйте её, чтобы отловить ошибку.

Неактивен

 

#23 29.11.2010 18:28:30

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: If в запросе.

vasya написал:

К сожалению, иного метода тестирования процедур пока нет.

Приведите полностью текст вашей процедуры.

P.S. А ещё лучше сделайте простейшую процедуру, которая лишь состовляет подготовленное выражение и запускает его и постепенно усложняйте её, чтобы отловить ошибку.

Нашел логическую ошибку

Есть такой кусок

Код:

select ... from ..
                 date_time between @date1 and @date2 and
                 id_client like @ip';

Вот тут то и ругается ...

Как правильно в такой выборке указать           between @date1 and @date2 and

Неактивен

 

#24 29.11.2010 19:57:16

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

Re: If в запросе.

Так как указано правильно, за исключением апострофа после ip.

Неактивен

 

#25 30.11.2010 11:10:25

kharkov_max
Завсегдатай
Зарегистрирован: 12.09.2009
Сообщений: 62

Re: If в запросе.

Апостороф это конец текстовой строки, это правильно.

Сейчас я сделел так:

Код:

select ... from 
                 id_client like @ip and
                 date_time between @date1 and @date2';

И все работает.

Но не могу понять как вставить конструкцию date_time between @date1 and @date2 не в конец from а к примеру в начало или в середину.

Неактивен

 

Board footer

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