Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: MySQL. Глюк с обработкой множественных ошибок в процедурах.  (Прочитано 7951 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« : 28-08-2012 12:20 » 

Проблема в том, что оператор может сгенерить несколько ошибок и предупреждений, но перехвачено будет только что-то одно. С багой можно столкнуться при обработке MySQL error code 1329 (он же SQLSTATE 02000, он же NOT FOUND) при чтении курсора или выполнения SELECT INTO. Несмотря на перехват ошибки с помощью HANDLER, из процедуры может вернуться warning и навести шороху на клиента.

Бага известна с год, но исправлена она в 5.6.3, а более ранние версии по прежнему содержат ошибку. Оригинальное решение, учитывая, что 5.6 не выпускали в community editon.

В официальной документации предлагается затереть ошибку дополнительным запросом с гарантированным FOUND.
http://dev.mysql.com/doc/refman/5.5/en/condition-handling.html
Нечто вроде:

Код: (MySQL)
    DECLARE CONTINUE HANDLER FOR NOT FOUND
        BEGIN
            -- clear warning (before MySQL 5.6.3)
            DECLARE dummy INT;
            SELECT 1 INTO dummy FROM (SELECT 1) AS t;

            -- далее код обработчика
        END;


Может кому пригодится.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 17-10-2012 07:20 » new

Еще об обработке ошибок в MySQL: поддержка SQL STATE вводилась в синтаксис MySQL исключительно для поддержки стандарта SQL, когда как родная система использует собственные номера ошибок MySQL и отличается большей детализацией исключений. На сайте MySQL есть комментарий, подчеркивающий, что из-за несовместимости диалектов SQL прямой перенос процедур MySQL в БД других производителей невозможен и придерживаться использования только SQL STATE нет смысла. Лучше использовать родные коды ошибок.
Например, для NOT FOUND:

Код: (MySQL)
    DECLARE NOT_FOUND CONDITION FOR 1329;
    DECLARE CONTINUE HANDLER FOR NOT_FOUND ...;
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines