Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток!
Вопрос следующий. Можно ли в ТЕЛЕ ХРАНИМОЙ ПРОЦЕДУРЫ при возникновении SQLEXCEPTION каким - либо образом определить код возникшей ошибки или сообщение об ошибке. Поделитель опытом.
Отредактированно Prm (23.07.2009 13:22:41)
Неактивен
IF mysql_errno() = x THEN y
ELSE z;
Неактивен
При использовании конструкции 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 - конкретные коды ошибок.
Т.о. необходимо перечислять кучу обработчиков ошибок. Последний вариант очень привлекательный, НО КАК ПОЛУЧИТЬ КОД ОШИБКИ?
Неактивен
Здраствуйте, используеться мускул 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;
Неактивен
Что-то как-то в этой теме нет ни одного ответа... попробую ответить
1. К сожалению, код ошибки поймать не удастся. В MySQL нет понятия «последняя ошибка»,
есть только понятие «текущее действие завершилось с ошибкой». Соответственно, если Вы
перехватили ошибку обработчиком, то «текущее действие с ошибкой уже не завершилось».
С другой стороны, в хранимых процедурах обычно хотят перехватить ожидаемые ошибки, а
полный текст других ошибок будет доступен вызывающему приложению: «процедура завершилась
некорректно».
2. Обновите 5.0.18 — это уже очень старая версия, в пятерке очень много изменений касается
хранимого кода. В частности, скорее всего, Ваш сервер перестанет падать от вашего кода
Проблемы начинаются, очевидно, вот тут:
SELECT currentday INTO @dayofyear_save FROM people_mem LIMIT 1;
На пустой таблице у меня это приводит к warning. У Вас — к падению сервера.
Неактивен