Задавайте вопросы, мы ответим
Вы не зашли.
С добрым.
Есть процедура в ней курсор, который открывается до цикла while ...do
в цикле fetch... в переменные затем идет вставка на основе значений полученных из fetch.
Выход из цикла происходит по continue handler for sqlstate = '02000'.
Потом закрываю курсор. Казалось бы все до безобразия просто и в целом работает, но возникает непонятная ситуация.
В курсоре 3 записи (проверял руками ), а когда обрабатываются они внутри цикла последняя запись обрабатывается дважды.
И если мне нужно вставить 3 записи на основе данных курсора, у меня вставится 4, почему такое происходит ?
Подскажите ? Думал гадал, ничего не приходит в голову.
Неактивен
Приведите пример в виде
create table ..
insert into ..
create procedure ..
чтобы можно было воспроизвести.
Неактивен
declare continue handler for sqlstate '02000' set cur1_done=true;
сработает когда данные закончатся, т.е. на четвертом заходе
вам нужно declare exit
Неактивен
Спасибо, буду разбираться, есть еще пару вариантов. Не хочется костыли городить.
Решилось заменой continue на exit, а точнее чтобы еще и варнингов не выбрасывал по этому вопросу - declare exit handler for sqlwarning set cursor1_done=true;
Большой спасибо, за толковую наводку, а то после огнептицы немного непривычно с курсорами работать.
Отредактированно condor (12.02.2014 22:43:51)
Неактивен
Продолжая тему курсоров вопрос - как организовать выход из курсора чтобы процедура не возвращала хендл ошибки или ворнинга, блин очень неудобная весчь ((( Даже если процедура корректно отрабатывает - возвращает ворнинги, это печаль.
Неактивен
Посмотрите пример на http://dev.mysql.com/doc/refman/5.5/en/ … dling.html
Неактивен
В том то и прикол, если из процедуры1 вызывать другую процедуру2 в которой произойдет warning. Первая завершится с ворнингом.
НУ ладно, буду на клиенте обрабатывать эту ситуацию. Неприятно, в postgreSQL и firebird там с курсорами работать одно удовольствие если честно.
Ладно будем дальше пинать литературу, просто вчера пол ночи читал как это обойти, и все таки пришел к решению обрабатывать данное исключение
вызванное в процедуре на клиенте. По другому никак не получится.
Неактивен
Там от версии зависит.
Before MySQL 5.6.3, if a statement that generates a warning or error causes a condition handler to be invoked, the handler may not clear the diagnostic area...
Неактивен