Задавайте вопросы, мы ответим
Вы не зашли.
А где открывается кавычка — покажите, пожалуйста?
Неактивен
Ну я делаю так:
....... 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); .............
Неактивен
Что-то я не понял, а где у вас 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
Неактивен
Огромное спасибо, не дочитал man именно это мне было и нужно.
Все заработало.
Неактивен
Возникло еще пару вопросов.
Новую тему не хочу создавать т.к. вопрос пересекается с текущей темой.
Есть такая процедура:
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
Как мне продставить в запрос курсора значения (имя тяблицы, имя столбца) из входных параметров процедуры?
Мне нужно будет делыть несколько таких обработок, для разных таблиц, поэтому хочу сделать одну универсальную процедуру.
Спасибо.
Неактивен
kharkov_max написал:
Вопрос -1
У меня не получается сравнить передаваемую в процедуру строку и результат курсора, если в таблице есть одинаковые значения.Код:
if str = name then set i=i+1; end if;Если ставлю str <> name то счетчик увеличивается.
Как правильно сравнить строки?
Такие вопросы проще обсуждать на примере тестовых данных, иначе будет разговор глухого со слепым.
kharkov_max написал:
Вопрос 2
Как мне подставить в запрос курсора значения (имя таблицы, имя столбца) из входных параметров процедуры?
Мне нужно будет делыть несколько таких обработок, для разных таблиц, поэтому хочу сделать одну универсальную процедуру.
Спасибо.
По-моему, никак.
Неактивен
Вопрос -1 решил.
Осталося вопрос 2.
Как мне продставить в запрос курсора значения (имя тяблицы, имя столбца) из входных параметров процедуры?
Мне нужно будет делыть несколько таких обработок, для разных таблиц, поэтому хочу сделать одну универсальную процедуру.
Неактивен
Не уже ли, нет ни какого выхода ?
Неактивен
http://forums.mysql.com/read.php?61,116 … msg-226041
Не это ли выход из ситуации?
Неактивен
kharkov_max написал:
http://forums.mysql.com/read.php?61,116597,226041#msg-226041
Не это ли выход из ситуации?
Да, это выход. Как-то о представлениях я не подумал.
А ещё можно просто не использовать курсоры
Неактивен
Ну, и конечно, при использовании представлений нужно следить, чтобы использовался алгоритм MERGE.
Иначе, если у вас будет происходить копирование больших частей исходной таблицы во временную, то это плохое практическое решение. Тогда уж лучше тупо написать N-ое кол-во процедур для обработки разных таблиц.
Неактивен
Вот рабочий код который у меня получился в результате. Все работает так как я хотел.
Посмотрите пожалуйста, может найдете какие недочеты.
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 ;
Неактивен
kharkov_max написал:
Вот рабочий код который у меня получился в результате. Все работает так как я хотел.
- Папа, а почему солнце каждый день встает на востоке, а заходит на западе?
- Ты это проверял? Это точно так?
- Да.
- Тогда, слушай внимательно. Раз работает, то ничего не трогай!
kharkov_max написал:
Посмотрите пожалуйста, может найдете какие недочеты.
Автор напрягался слова придумывал, а его никто не читает.
Это я про свой пост под номером 31, где указывал на ошибочность обработки исключения. В текущей реализации с этой ошибкой вы не столкнетесь, но если станете проверять счетчик на соответствие 1, то получите грабли.
В целом же не понятно зачем такие сложности с созданием представления и курсора. Особенно учитывая, что последний мой пост в данном случае весьма актуален.
Вам нужно лишь узнать есть ли соответствие в колонке col таблицы tbl строке str.
выполните, что-нибудь вроде
select count(*) from tbl where col=str
и сравните результат с нулем.
Неактивен
Вы меня не так поняли.
Я хочу откатать задуманный мной вариант, а потом применить Ваше решение.
Мне как начинающему будет очень полезно попробовать оба варианта.
Я даже уверен что Ваше решение будет работать быстрее.
Сейчас наткнулся на очередную проблему.
При выполнении моего запроса сервер ровно через 600 сек сбрасывает подключение и выдает ошибку:
Error Code: 2013 Lost connection to MySQL server during query
Не хочется тратить время на google для поиска ответа, хочу допилить запрос.
Подскажите каким запросом можно посмотреть значения системных переменных сервера и найти виновное значение?
Для сервера использовал минимальный конфиг my.cnf т.е. настройки все по default.
В моей таблице, которую я хочу обработать уже более 150000 строк.
Пробовал на сервере увеличивать параметры до:
connect_timeout = 28800
wait_timeout = 28000
Эти изменения мне не помогли.
На клиента я таймаут увеличил до 6000 сек - тоже без результата.
Неактивен
Прозрения так и не наступило, не могу увидеть на клиенте нормальное завершение моего запроса.
Через 600 сек клиент выдает ошибку ...
Неактивен
Перерыл все что можно и ответа пока не могу найти, но это
http://forums.mysql.com/read.php?161,391544,391681
наводит на мысль, что это время ограничено в моем клиенте ...
Если есть возможность можете подтвердить мои подозрения ?
Качал клиента тут http://dev.mysql.com/downloads/workbench/
Вываливается через 600 секунд.
Но Mysql обрабатывает процедуру дальше, это видно как минимум по процессору сервера.
Неактивен
Ошибку выдает клиент http://dev.mysql.com/doc/refman/5.1/en/ … erver_lost
Workbench не использовал, поэтому ничего не могу сказать про его настройки.
Неактивен