|
|
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Есть процедура: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. Как обрабатывать передать запустившему, что процедура закончилась с ошибкой? set @error='1064'; - неработает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 19:42:14 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
O! Steven13, благодарю за пример, мне пригодился! А как сообщить - так просто, OUT или INOUT параметром процедуры. Или это не подходит под задачу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 21:06:37 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Нет, хочется что-бы движок сам обрабатывал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 23:32:30 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Хоть бери и целенаправленно вызывай неправильную функцию. например: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2005, 23:37:50 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Дока гласит - "SIGNAL and RESIGNAL statements are not currently supported." Но это не значит что так оно и есть в самом последнем билде, знаю я их... Просто пока еще не весь процедурный язык слизали с DB2. SIGNAL оно по-крайней мере распознает, только на остальной синтаксис оригинала ругается. Тебе же остаются 3 варианта - возвращать параметр, - попробовать DECLARE EXIT HANDLER FOR SQLSTATE VALUE ..... (должна вроде как вылететь за милую душу) - искуственно вызывать нужную ошибку каким-нидь идиотским оператором, да... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 11:02:54 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Astron Несмог розобратся. Можешь обяснить поподробней как это работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 19:55:10 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Вариант 1 - объяви процедуру как create procedure myproc(out succ int) begin ............. if OK then set succ=1; else set succ=0; end if; end| и вызывай на здоровье call myproc(@retvar); Вариант 2 - с HANDLER - если непоймешь из родной доки, читай IBM-овскую на DB2, там подробнее. Слизано это оттуда. Не знаю правда, подойдет ли это к тебе под задачу, делает он не совсем то, алгоритм менять... У IBM, в оригинале, есть оператор SIGNAL, как раз ставить нужный SQLSTATE. У майскуля пока нету, если верить доке. Может к релизу 5-й версии доделают, а может уже и сделали, а доку не поменяли. Говорят 5.0.6 уже вышла, у меня ее нет, проверить не на чем. Моя 5.0.2 SIGNAL все-таки распознает, но что ей надо после написать - не знаю. Вариант 3 - вызвать ошибку специально, ломать не строить, косой оператор напиши. Только это криво. Правильно вариант 1. Процедура откатила транзакцию, вернула ошибку. Ты же хочешь чтобы она нагадила на уровень вверх, отсюда вопрос - а не бардачно ли распределена работа между процедурой и вызывающей ее частью софта.... Хотя вся проблема мне кажется непонятной ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 22:03:13 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
У меня 5.0.7. Проблема в том, что процедура вызывается их XML, из разных страниц. Очень нехочется ещё в придачу к сохранённой процедуре писать дополнительный код в каждую страницу. Лучше всё затолкать в неё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2005, 22:28:53 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Так и я про то же - надо все запихать в нее, так чтобы необходимость во внешней обработке пропала. Я так понимаю, есть желание на стороне клиента получить серверную ошибку, хотя ее нет, фактически это ошибка приложения. Увы, пока никак :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2005, 21:10:39 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Всё ещё интересует этот вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2005, 19:39:13 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Мы отожгли это примерно так, как ты не хочешь делать. т.е. в переменную ложим код ошибки, после выполнения процедуры ее обрабатываем 2-й процедурой, которая код ошибки приводит в текст по табличке ошибок. Пока не добавлено распарсивание сведений в самих текстах, но чувствую, что уже нужно это реализовывать.... Тема интересная, хотелось бы узнать, что думает народ на эту тему. А пользоваться исключениями - в MySQL - это риводит к неправильной работе процедур, уже попарился с этим. Да и человеческий текст практически не выведешь. В MySQL нет механизна отправки клиенту произвольного исключения, типа как в ORACLE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2005, 13:33:27 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Валентин К Решил проблему почти просто, через out параметр. Вся хитрость в том кто это значение получает. call myproc(@error); А получает его переменная ошибки в XML. Тоесть получилось почти красиво. В переменную @error записует ошибку процедура, если в ней она исполнилась с ошибкой. Но если ошибка неявная, и процедура считает что её нет, она записует в @error=0, но нетут-то было, в исходящем параметре я передаю ошибку, и она напрямую попадает в переменную ошибки, и обработка прекращается. Правда я незнаю, каким боком это может мне вылезти? Что думаете по этому поводу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2005, 02:23:03 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Steven13 Валентин К Решил проблему почти просто, через out параметр. Вся хитрость в том кто это значение получает. call myproc(@error); А получает его переменная ошибки в XML. Тоесть получилось почти красиво. В переменную @error записует ошибку процедура, если в ней она исполнилась с ошибкой. Но если ошибка неявная, и процедура считает что её нет, она записует в @error=0, но нетут-то было, в исходящем параметре я передаю ошибку, и она напрямую попадает в переменную ошибки, и обработка прекращается. Правда я незнаю, каким боком это может мне вылезти? Что думаете по этому поводу? Вобщем-то абсолютно все равно идет ли переменная out-параметром, либо просто переменной, т.к. все равно нужно после выполнения вызова CALL выполнить вызов SELECT @... Посему мы просто завели зарезервированную переменную @OResult, в которую ложим код ошибки. Все положительные ошибки - выполнено успешно, все отрицательные - не выполнено. В зависимости от кода - вразумительный ответ. Потом просто запросиком select gf_Get_ErrorComments(), @OResult; я просто извлекаю функцией текст и сам код ошибки соответственно. Дальше естественно все просто. Извлечение идет по табличке сообщений, по типу ERR, вот собственно и все. Если не найдено описание, то берется "Невозможно выполнить операцию". Вот далее пока не реализовывали, нет времени в основном... Это просто более подробное описание действия. Иначе реализации ошибок либо невозможны, либо глючат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2005, 17:21:14 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Нет всё просто. Програма вылетает, ког-да в переменной @error появляется любое значение. В процедуре в исходящий параметр вносится 0, если ошибки нет, и текст если есть ошибка. Так-что больше ничего неприходится делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2005, 20:21:46 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Steven13Нет всё просто. Програма вылетает, ког-да в переменной @error появляется любое значение. В процедуре в исходящий параметр вносится 0, если ошибки нет, и текст если есть ошибка. Так-что больше ничего неприходится делать. Программа вылетает потому что ты останавливаешь выполнение процедуры, насколько я понимаю. А останавливать ее выполнение не нужно, пиши более гибкую логику, а ошибки отлавливай в конце. Причем переменные хорошо ловятся на всех уровнях процедур. Вобщем проблем с таким подходом найдено не было, отработали вполне нормально. Т.к. этот вопрос был поднят сразу при проектировании, то и бизнеслогика писалась в соответствии с ошибками. Все ошибки ищатся самими процедурами, а не генерируются сервером, а потом либо выполнение идет на другие уровни, либо пропускается и выходит с кодом ошибки в переменной. Такой вариан не подходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2005, 11:54:10 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
День добрый, Подскажите пожалуста как корректно организовать обработку ошибок (НЕ пользовательских) в хранимых процедурах с тем чтобы при ошибке откатить начатую в процедуре транзакцию и при этом вернуть через OUT параметр код возникшей ошибки. Я немогу найти функцию или переменную через которые пожно было бы узнать код ошибки. Получается что для каждого варианта ошибки нужно писать чтото вроде: DECLARE EXIT HANDLER FOR 1061 BEGIN my_err=1062; ROLLBACK; END; Т.Е. каждая процедура в которой я хочу отловить и вернуть код ошибки должна содержать столько таких выражений сколько я предполагаю возможных в ней ошибок: --------------------------------------------- CREATE PROCEDURE p1(OUT my_err INTEGER) BEGIN ...... DECLARE EXIT HANDLER FOR 1061 BEGIN my_err=1062; ROLLBACK; END; DECLARE EXIT HANDLER FOR 1062 BEGIN my_err=1062; ROLLBACK; END; .... и.т. далее .... /*логика процедуры*/ .... END ---------------------------------------------- Как то очень не красиво получается. Может обработчик хоть както можно вынести в отдельную функцию. Заранее спасибо. При исполь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.11.2005, 10:45:01 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
интересная инфа по этой теме http://forums.mysql.com/read.php?98,31753,31753#msg-31753 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2005, 10:57:38 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Для транзакций нужно использовать транзакционный движок. Далее нужно понимать, что объявив хендлер выхода процедура не будет выполнена до конца и rollback, который в конце болтается естественно не будт запущен. И если включено автосомитование транзакций, то вызванная ошибка не откатит транзакцию, а запостит ее. В нащей реализации процедуры внешнего уровня имеют такую структуру ... BEGIN START TRANSACTION; ... /*Тескт процедуры*/ IF @OResult<0 THEN ROLLBACK; ELSE COMMIT; END IF; END; Транзакции работают правильно, т.к. не однократно тестировали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2005, 12:23:04 |
|
||
|
Обработка ошибок в сохранённых процедурах.
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ, но если честно я немного вас не понял. Вы после каждой произведеной опереции (Insert? update...) проверяете ожидаемое кол-во возвращаемых запросом строк (типа ROW_COUNT()) и записываете результат в переменную @OResult и перед завершением процедуры анализируете ее и производите соответсвенно откат или подтверждение транзакции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2005, 12:27:11 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=33356868&tid=1853484]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
77ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 409ms |

| 0 / 0 |
