SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 23.07.2009 07:47:43

Prm
Участник
Зарегистрирован: 23.07.2009
Сообщений: 2

Определение кода ошибки в хранимой процедуре

Доброго времени суток!

Вопрос следующий. Можно ли в ТЕЛЕ ХРАНИМОЙ ПРОЦЕДУРЫ при возникновении SQLEXCEPTION каким - либо образом определить код возникшей ошибки или сообщение об ошибке. Поделитель опытом.

Отредактированно Prm (23.07.2009 13:22:41)

Неактивен

 

#2 23.07.2009 13:09:25

aram1234
Участник
Откуда: Armenia
Зарегистрирован: 18.07.2009
Сообщений: 2

Re: Определение кода ошибки в хранимой процедуре

IF mysql_errno() = x THEN y
ELSE z;

Неактивен

 

#3 23.07.2009 13:40:15

Prm
Участник
Зарегистрирован: 23.07.2009
Сообщений: 2

Re: Определение кода ошибки в хранимой процедуре

При использовании конструкции DECLARE EXIT HANDLER FOR SQLEXCEPTION ... код выполнения хранимой процедуры всегда =0, и результат mysql_errno() тоже будет равен нулю.


Поясню вопрос. В MySQL в хранимых процедурах обработка ошибок осуществляется след. образом (пример):

DECLARE EXIT HANDLER FOR SQLSTATE 'state1'
      SELECT 'error 1';

DECLARE EXIT HANDLER FOR SQLSTATE 'state2'
      SELECT 'error 2';

DECLARE EXIT HANDLER FOR SQLEXCEPTION
      SELECT 'undefined error'; /*здесь хотелось бы получить код возникшей ошибки*/

ГДЕ state1, state2 - конкретные коды ошибок.
Т.о. необходимо перечислять кучу обработчиков ошибок. Последний вариант очень привлекательный, НО КАК ПОЛУЧИТЬ КОД ОШИБКИ?

Неактивен

 

#4 02.09.2009 21:07:31

Warrior
Участник
Зарегистрирован: 02.09.2009
Сообщений: 1

Re: Определение кода ошибки в хранимой процедуре

Здраствуйте, используеться мускул 5.0.18, создана хранимая процедура
-------------------------------------------
BEGIN
    /*--поиск дней рождения людей и добавление автопоздравлений--*/
    /*--создана Warrior(kiawar@mail.ru)--*/
    /*--последняя модификация 24-09-2009 21:12--*/
   
    DECLARE id TINYINT(3);
    DECLARE rows SMALLINT(6); #кол-во не пустых строк в таблице
    DECLARE random_text TEXT; #случайное поздравление
    DECLARE author VARCHAR(20) DEFAULT 'Администрация сайта';
    DECLARE family VARCHAR(20);     #фамилия
    DECLARe name VARCHAR(20);       #имя
    DECLARE patronymic VARCHAR(20); #отчество
    DECLARE sex TINYINT(1);         #пол
    DECLARE birthday DATE;          #дата рождения
    DECLARE end INT DEFAULT 0;      #конец курсора
    DECLARE dayofyear SMALLINT(6) DEFAULT 0;#порядковый день в текущем году
    DECLARE curyear,dayofbase INT;  #декущий год(ЧЧЧЧ) и день в году рождения
    DECLARE strcuryear VARCHAR(10); #строка вида текущий ГГГГ-%
   
    #CURSOR
    DECLARE curpeople CURSOR FOR SELECT * FROM people;
    #handler
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET end = 1;
   
    #номер дня в году текущей даты
    SET dayofyear := DAYOFYEAR(NOW());

    #получение сохраннеого значения
    SELECT currentday INTO @dayofyear_save FROM people_mem LIMIT 1;
    #IF (@dayofyear_save is NULL) THEN INSERT INTO people_mem values('','ttt','ttt','tttt','01/01/1970','','');
    #END IF;
    #SELECT dayofyear;
    #проверяем сохраненный день
    IF ( @dayofyear_save = dayofyear) THEN  SELECT * FROM people_mem; #returm from HEAP(MEMORY) table
       ELSE
           inn : BEGIN
               
                #удаляем временные записи из HEAP таблицы
                TRUNCATE TABLE people_mem;
                #сохраняем текущий день
                SET @dayofyear_save = dayofyear;

                SET curyear = DATE_FORMAT(NOW(),'%Y');
                SET strcuryear = CONCAT(curyear,'-%');
                #open cursor
                OPEN curpeople;
   
                cycle : LOOP
                           
                            FETCH curpeople INTO id,family,name,patronymic,birthday,sex;
                           
                            IF end THEN LEAVE cycle;
                            END IF;
                             
                            SET dayofbase = DAYOFYEAR(REPLACE(birthday,DATE_FORMAT(birthday,'%Y'),curyear));
                           
                            IF ( dayofyear<=dayofbase AND dayofbase<=dayofyear+period ) THEN
                               #добавляем во временную таблицу
                               INSERT INTO people_mem values(id,family,name,patronymic,birthday,@dayofyear_save,sex);
                               
                               SELECT COUNT(*) INTO rows FROM people_cong where id_people = id AND date_post LIKE strcuryear;
                               
                               IF (rows = 0) THEN
                                 
                                  SELECT congratulate INTO random_text FROM etalon_congratulate ORDER BY RAND() LIMIT 1;
                                  INSERT INTO people_cong values('',id,author,random_text,NOW());
                                   
                               END IF;
                            END IF;
               #select id,famaly,patronymic;
               END LOOP cycle;
               #close cursor
               CLOSE curpeople;
               SELECT * FROM people_mem;
               
            END inn;       
    END IF;
   
   

END
-------------------------------------------------------
не срабатыет процудура,пока в хип таблице нету не одной записи, если ручками добавляю INSERT INTO people_mem values('','ttt','ttt','tttt','01/01/1970','',''); то вызов процудуры выполняеться на ура, пошел другим путем решил в скрипте добавлять строку   INSERT INTO people_mem values('','ttt','ttt','tttt','01/01/1970','','');, так вот засада строка из скрипта не добавляеться. В чем проблема не пойму, процедура запускаеться от имени пользователя с правами на запуск самой процедуры там и на выбор, изменение, вставку и удаление записей из хип таблицы.

при вызове процедуры из скрипта СУБД уходит в аут, теряется подключение к СУБД(Lost connection...), если добавляю в хип таблицу строку то все проходит на ура. интересует как же получить код ошибки из хранимой процедуры.


з.ы. структура хип таблицы
CREATE TABLE `people_mem` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `family` varchar(20) default NULL,
  `name` varchar(20) default NULL,
  `patronymic` varchar(20) default NULL,
  `birthday` date NOT NULL,
  `currentday` smallint(3) default NULL,
  `sex` tinyint(1) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MEMORY DEFAULT CHARSET=latin1;

Неактивен

 

#5 02.09.2009 21:33:12

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

Re: Определение кода ошибки в хранимой процедуре

Что-то как-то в этой теме нет ни одного ответа... попробую ответить smile

1. К сожалению, код ошибки поймать не удастся. В MySQL нет понятия «последняя ошибка»,
есть только понятие «текущее действие завершилось с ошибкой». Соответственно, если Вы
перехватили ошибку обработчиком, то «текущее действие с ошибкой уже не завершилось».

С другой стороны, в хранимых процедурах обычно хотят перехватить ожидаемые ошибки, а
полный текст других ошибок будет доступен вызывающему приложению: «процедура завершилась
некорректно».

2. Обновите 5.0.18 — это уже очень старая версия, в пятерке очень много изменений касается
хранимого кода. В частности, скорее всего, Ваш сервер перестанет падать от вашего кода wink

Проблемы начинаются, очевидно, вот тут:

SELECT currentday INTO @dayofyear_save FROM people_mem LIMIT 1;

На пустой таблице у меня это приводит к warning. У Вас — к падению сервера.

Неактивен

 

Board footer

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