powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Обработка RAISERROR
2 сообщений из 2, страница 1 из 1
Обработка RAISERROR
    #32523000
DmitryAndreev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер!
Призведя поиск в форуме я , к сожалению, так и не нашел ясного ответа на свой вопрос.
Задача состоит в следующем: при выполнении ХП я бы хотел обработать и системные, и пользовательские исключения в одном блоке.

В триггере на BEFORE INSERT FOR EACH ROW при выполнении определенных условий я выбрасываю ошибку следующим образом:
Код: plaintext
1.
2.
declare _EX_TK_CARDSERIES_FSN_RANGE_OVERFLOW exception for sqlstate '20025';
raiserror _EX_TK_CARDSERIES_FSN_RANGE_OVERFLOW, 'TRG_CardSeriesFSNInsert';
, где _EX_TK_CARDSERIES_FSN_RANGE_OVERFLOW добавлен в SYSUSERMESSAGES.
В ХП, в которой выполняется некий набор действий, я поступаю следующим образом:
Код: 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.
BEGIN
        declare _PROC_NAME long varchar;
        set _PROC_NAME = '...'
begin
                declare _EX_INDEX_NOT_UNIQUE exception for sqlstate '23505';
                declare _EX_TK_CARDSERIES_FSN_RANGE_OVERFLOW exception for sqlstate '20025';
                INSERT INTO Table (...) VALUES (...) 
                exception
                        when _EX_TK_CARDSERIES_FSN_RANGE_OVERFLOW then
                                rollback;
                                ...
                                call EventLogger.PROC_MakeTrace( 6 , _PROC_NAME, errormsg());
                                commit;
                        when _EX_INDEX_NOT_UNIQUE then
                                rollback;
                                ...
                                ...
                                call EventLogger.PROC_MakeTrace( 6 , _PROC_NAME, errormsg());
                                commit;
        end
        exception
                when others then
                        rollback;
                        call EventLogger.PROC_MakeError (_PROC_NAME, errormsg());
                        commit;
                        resignal;
END
В случае, если вылетает системный exception на _EX_INDEX_NOT_UNIQUE, он успешно отлавливается в соответствующем месте и обрабатывается. Но в случае выброса триггером "raiserror _EX_TK_CARDSERIES_FSN_RANGE_OVERFLOW " он ловится только в "exception when others then"; более того, он не выбрасывается наверх даже resignal'ом.
Если в триггере заменить RAISERROR на
Код: plaintext
1.
2.
declare _EX_TK_CARDSERIES_FSN_RANGE_OVERFLOW exception for sqlstate '20025';
signal _EX_TK_CARDSERIES_FSN_RANGE_OVERFLOW;
, то при этом он успешно отлавливается в соответствующей ветке, но никакой дополнительной строковой информации об ошибке, естественно, не выдает.

В чем дело? Почему RAISERROR не отлавливается? Как поступить в данной ситуации?
...
Рейтинг: 0 / 0
Обработка RAISERROR
    #32529918
banshee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А SQLSTATE 20025 это код стандартной ошибки? Если мне не изменяет память, по крайней мере в ASA, для пользовательских SQLSTATE определен диапазон 99000-99999.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Обработка RAISERROR
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]