SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 12.02.2014 19:46:55

condor
Участник
Зарегистрирован: 12.02.2014
Сообщений: 6

Курсор в хранимой процедуре

С добрым.
Есть процедура в ней курсор, который открывается до цикла while ...do
в цикле fetch... в переменные затем идет вставка на основе значений полученных из fetch.
Выход из цикла происходит по continue handler for sqlstate = '02000'.
Потом закрываю курсор. Казалось бы все до безобразия просто и в целом работает, но возникает непонятная ситуация.
В курсоре 3 записи (проверял руками wink ), а когда обрабатываются они внутри цикла последняя запись обрабатывается дважды.
И если мне нужно вставить 3 записи на основе данных курсора, у меня вставится 4, почему такое происходит ?
Подскажите ? Думал гадал, ничего не приходит в голову.

Неактивен

 

#2 12.02.2014 19:54:14

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

Re: Курсор в хранимой процедуре

Приведите пример в виде
create table ..
insert into ..
create procedure ..

чтобы можно было воспроизвести.

Неактивен

 

#3 12.02.2014 20:26:05

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

Re: Курсор в хранимой процедуре

declare continue handler for sqlstate '02000' set cur1_done=true;
сработает когда данные закончатся, т.е. на четвертом заходе
вам нужно declare exit

Неактивен

 

#4 12.02.2014 22:02:51

condor
Участник
Зарегистрирован: 12.02.2014
Сообщений: 6

Re: Курсор в хранимой процедуре

Спасибо, буду разбираться, есть еще пару вариантов. Не хочется костыли городить.
Решилось заменой continue на exit, а точнее чтобы еще и варнингов не выбрасывал по этому вопросу - declare exit handler for sqlwarning set cursor1_done=true;
Большой спасибо, за толковую наводку, а то после огнептицы немного непривычно с курсорами работать.

Отредактированно condor (12.02.2014 22:43:51)

Неактивен

 

#5 15.02.2014 01:53:08

condor
Участник
Зарегистрирован: 12.02.2014
Сообщений: 6

Re: Курсор в хранимой процедуре

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

Неактивен

 

#6 15.02.2014 18:55:57

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

Re: Курсор в хранимой процедуре

Посмотрите пример на http://dev.mysql.com/doc/refman/5.5/en/ … dling.html

Неактивен

 

#7 15.02.2014 22:42:37

condor
Участник
Зарегистрирован: 12.02.2014
Сообщений: 6

Re: Курсор в хранимой процедуре

В том то и прикол, если из процедуры1 вызывать другую процедуру2 в которой произойдет warning. Первая завершится с ворнингом.
НУ ладно, буду на клиенте обрабатывать эту ситуацию. Неприятно, в postgreSQL и firebird там с курсорами работать одно удовольствие если честно.
Ладно будем дальше пинать литературу, просто вчера пол ночи читал как это обойти, и все таки пришел к решению обрабатывать данное исключение
вызванное в процедуре на клиенте. По другому никак не получится.

Неактивен

 

#8 15.02.2014 22:52:11

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

Re: Курсор в хранимой процедуре

Там от версии зависит.

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

Неактивен

 

Board footer

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