SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#26 30.11.2010 11:44:19

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

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

А где открывается кавычка — покажите, пожалуйста?

Неактивен

 

#27 30.11.2010 11:47:22

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

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

Ну я делаю так:

Код:

.......
set query1                     = 'select';
set query2                     = ' .....';
set query3                     = ' from ......
                                        id_client like @ip and
                                        date_time between @date1 and @date2';

set query                      = concat(query1, query2, query3);
.............

Неактивен

 

#28 30.11.2010 11:48:56

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

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

Что-то я не понял, а где у вас where? Приводите полные варианты запроса, а то гадать приходится.

from `имя таблицы` where date_time between @date1 and @date2 and id_client like @ip

для удобства собственного восприятия запроса можно поставить скобки:

from `имя таблицы` where (date_time between @date1 and @date2) and id_client like @ip

Неактивен

 

#29 30.11.2010 12:04:13

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

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

Огромное спасибо, не дочитал man именно это мне было и нужно.
Все заработало.

Неактивен

 

#30 01.12.2010 07:49:36

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

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

Возникло еще пару вопросов.
Новую тему не хочу создавать т.к. вопрос пересекается с текущей темой.

Есть такая процедура:

Код:

delimiter $$
CREATE PROCEDURE update_table (tbl VARCHAR(10), col VARCHAR(10), str VARCHAR(25))
BEGIN
declare name VARCHAR(25);
declare done,i integer default 0;
declare proc_cursor Cursor for Select dns_name from dns_client group by dns_name;
declare continue handler for sqlstate '02000' set done=1;

/*set @query  = concat('select ',col,' from ',tbl);
prepare result from @query;
execute result;*/

open proc_cursor;
    while done = 0 do 
        fetch proc_cursor into name;
/*        if strcmp(str,name) = 0 then */
        if str = name then
            set i=i+1; 
        end if;
    end while;
close proc_cursor;

if i = 0 then
    set @query = concat('insert into ', tbl,' values('' '' ,',' '' ',str,' '' ',')');
    prepare ins from @query;
    execute ins;
    deallocate prepare ins;
/*    insert into dns_client values('',str);*/
end if;
END$$
delimiter ;

Вопрос -1
У меня не получается сравнить передаваемую в процедуру строку и результат курсора, если в таблице есть одинаковые значения.

Код:

if str = name then
            set i=i+1; 
end if;

Если ставлю str <> name то счетчик увеличивается.
Как правильно сравнить строки?

Вопрос 2
Как мне продставить в запрос курсора значения (имя тяблицы, имя столбца) из входных параметров процедуры?

Мне нужно будет делыть несколько таких обработок, для разных таблиц, поэтому хочу сделать одну универсальную процедуру.

Спасибо.

Неактивен

 

#31 01.12.2010 11:56:45

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

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

kharkov_max написал:

Вопрос -1
У меня не получается сравнить передаваемую в процедуру строку и результат курсора, если в таблице есть одинаковые значения.

Код:

if str = name then
            set i=i+1; 
end if;

Если ставлю str <> name то счетчик увеличивается.
Как правильно сравнить строки?

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

mysql> select * from a;
+----+------+
| id | q    |
+----+------+
|  1 | one  |
|  2 | one  |
|  3 | two  |
|  4 | one  |
|  5 | five |
+----+------+
5 rows in set (0.00 sec)

delimiter //
create procedure test1 (str varchar(25))
begin
declare name varchar(25);
declare i,done integer default 0;
declare proc_cursor Cursor for Select q from a;
declare continue handler for sqlstate '02000' set done=1;

open proc_cursor;
    while done = 0 do
        fetch proc_cursor into name;
        if str = name then
            set i=i+1;
        end if;
select name,'  ',i;
    end while;
close proc_cursor;
select i;
end//

mysql> call test1('one');
+------+----+------+
| name |    | i    |
+------+----+------+
| one  |    |    1 |
+------+----+------+
1 row in set (0.00 sec)

+------+----+------+
| name |    | i    |
+------+----+------+
| one  |    |    2 |
+------+----+------+
1 row in set (0.00 sec)

+------+----+------+
| name |    | i    |
+------+----+------+
| two  |    |    2 |
+------+----+------+
1 row in set (0.00 sec)

+------+----+------+
| name |    | i    |
+------+----+------+
| one  |    |    3 |
+------+----+------+
1 row in set (0.01 sec)

+------+----+------+
| name |    | i    |
+------+----+------+
| five |    |    3 |
+------+----+------+
1 row in set (0.01 sec)

+------+----+------+
| name |    | i    |
+------+----+------+
| five |    |    3 |
+------+----+------+
1 row in set (0.01 sec)

+------+
| i    |
+------+
|    3 |
+------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)


Как видите счетчик увеличивается.
Я специально нагромоздил вывод текущих значений параметра name и счечика i, чтобы было наглядно видно, что последний элемент таблицы считается дважды. Это происходит потому, что вы указали, что при наступлении ошибки должна быть продолжена обработка блока - continue handler
А нужно, чтобы при наступлении ошибки происходил выход из блока, т.е. exit

kharkov_max написал:

Вопрос 2
Как мне подставить в запрос курсора значения (имя таблицы, имя столбца) из входных параметров процедуры?

Мне нужно будет делыть несколько таких обработок, для разных таблиц, поэтому хочу сделать одну универсальную процедуру.

Спасибо.

По-моему, никак.

Неактивен

 

#32 01.12.2010 11:59:02

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

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

Вопрос -1 решил.
Осталося вопрос 2.

Как мне продставить в запрос курсора значения (имя тяблицы, имя столбца) из входных параметров процедуры?

Мне нужно будет делыть несколько таких обработок, для разных таблиц, поэтому хочу сделать одну универсальную процедуру.

Неактивен

 

#33 01.12.2010 12:21:03

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

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

Не уже ли, нет ни какого выхода ?

Неактивен

 

#34 01.12.2010 12:29:06

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

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

http://forums.mysql.com/read.php?61,116 … msg-226041
Не это ли выход из ситуации?

Неактивен

 

#35 01.12.2010 12:45:56

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

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

kharkov_max написал:

http://forums.mysql.com/read.php?61,116597,226041#msg-226041
Не это ли выход из ситуации?

Да, это выход. Как-то о представлениях я не подумал.

А ещё можно просто не использовать курсоры smile

delimiter //
create procedure test1 (str varchar(25),table_name varchar(25), col_name varchar(25))
begin

set @query = concat('select max(@i) into @co from ',table_name,',(select @i:=0) x where if(q="',str,'",@i:=@i+1,0)');
prepare zxc from  @query;
execute zxc;
select @co;
end//

mysql> call test1('one','a','q');
+------+
| @co  |
+------+
|    3 |
+------+
1 row in set (0.02 sec)

Query OK, 0 rows affected (0.02 sec)

Неактивен

 

#36 01.12.2010 12:58:31

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

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

Ну, и конечно, при использовании представлений нужно следить, чтобы использовался алгоритм MERGE.
Иначе, если у вас будет происходить копирование больших частей исходной таблицы во временную, то это плохое практическое решение. Тогда уж лучше тупо написать N-ое кол-во процедур для обработки разных таблиц.

Неактивен

 

#37 01.12.2010 13:27:00

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

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

Вот рабочий код который у меня получился в результате. Все работает так как я хотел.
Посмотрите пожалуйста, может найдете какие недочеты.

Код:

delimiter $$
CREATE PROCEDURE update_table (tbl VARCHAR(10), col VARCHAR(10), str VARCHAR(25))
BEGIN
declare name VARCHAR(25);
declare done,i integer default 0;
declare proc_cursor cursor for select * from temp_tbl;
declare continue handler for sqlstate '02000' set done=1;

set @query  = concat('create view temp_tbl as select ',col,' from ',tbl,' group by ',col);
prepare result from @query;
execute result;
deallocate prepare result;

open proc_cursor;
    fetch proc_cursor into name;
        while done = 0 do 
            fetch proc_cursor into name;
            if trim(str) = trim(name) then
                set i=i+1;
                set done=1;
            end if;
        end while;
close proc_cursor;
drop view temp_tbl;

if i = 0 then
    set @query = concat('insert into ', tbl,' values('' '' ,','''',str,'''',')');
/*    insert into dns_client values('',str);*/
    prepare ins from @query;
    execute ins;
    deallocate prepare ins;
end if;
END$$
delimiter ;

Неактивен

 

#38 01.12.2010 14:00:39

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

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

kharkov_max написал:

Вот рабочий код который у меня получился в результате. Все работает так как я хотел.

- Папа, а почему солнце каждый день встает на востоке, а заходит на западе?
- Ты это проверял? Это точно так?
- Да.
- Тогда, слушай внимательно. Раз работает, то ничего не трогай!

kharkov_max написал:

Посмотрите пожалуйста, может найдете какие недочеты.

Автор напрягался слова придумывал, а его никто не читает.
Это я про свой пост под номером 31, где указывал на ошибочность обработки исключения. В текущей реализации с этой ошибкой вы не столкнетесь, но если станете проверять счетчик на соответствие 1, то получите грабли.

В целом же не понятно зачем такие сложности с созданием представления и курсора. Особенно учитывая, что последний мой пост в данном случае весьма актуален.

Вам нужно лишь узнать есть ли соответствие в колонке col таблицы tbl строке str.
выполните, что-нибудь  вроде
select count(*) from tbl where col=str
и сравните результат с нулем.

Неактивен

 

#39 01.12.2010 18:03:17

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

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

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

Сейчас наткнулся на очередную проблему.
При выполнении моего запроса сервер ровно через 600 сек сбрасывает подключение и выдает ошибку:

Код:

Error Code: 2013
Lost connection to MySQL server during query

Не хочется тратить время на google для поиска ответа, хочу допилить запрос.
Подскажите каким запросом можно посмотреть значения системных переменных сервера и найти виновное значение?
Для сервера использовал минимальный конфиг my.cnf т.е. настройки все по default.
В моей таблице, которую я хочу обработать уже более 150000 строк.

Пробовал на сервере увеличивать параметры до:
connect_timeout = 28800
wait_timeout = 28000

Эти изменения мне не помогли.
На клиента я таймаут увеличил до 6000 сек - тоже без результата.

Неактивен

 

#40 01.12.2010 18:30:09

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

Неактивен

 

#41 02.12.2010 11:32:53

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

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

Прозрения так и не наступило, не могу увидеть на клиенте нормальное завершение моего запроса.
Через 600 сек клиент выдает ошибку ...

Неактивен

 

#42 02.12.2010 13:50:56

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

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

Перерыл все что можно и ответа пока не могу найти, но это
http://forums.mysql.com/read.php?161,391544,391681
наводит на мысль, что это время ограничено в моем клиенте ...

Если есть возможность можете подтвердить мои подозрения ?
Качал клиента тут http://dev.mysql.com/downloads/workbench/
Вываливается через 600 секунд.
Но Mysql обрабатывает процедуру дальше, это видно как минимум по процессору сервера.

Неактивен

 

#43 02.12.2010 14:24:48

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

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

Ошибку выдает клиент http://dev.mysql.com/doc/refman/5.1/en/ … erver_lost

Workbench не использовал, поэтому ничего не могу сказать про его настройки.

Неактивен

 

Board footer

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