Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
arkazar Участник со стажем
Вступление в Клуб: 27.09.2010
|
Пт Мар 23, 2012 15:51  Как узнать какая ошибка произошла в другой операции? |
|
Полезность: Нет оценки
|
Добрый день!
Подскажите, как можно при вызове из одной операции другую (в частности закрытие РКО) узнать какая ошибка, не дала закрыть счёт?
Мне нужен именно текст, чтобы отобразить в коммуникационный канал. |
|
 |
Alexsey Эксперт
Вступление в Клуб: 06.09.2007
|
Пт Мар 23, 2012 16:15   |
|
Полезность: Нет оценки
|
перехватить ошибку.. и вывести SQLERRM
например:
Код: | begin
....
exception
when OTHERS then
if v_console then
stdio.put_line_buf ('Ошибка обработки строки выписки № '||this.[NUM_STR]||': '||::[IMS_BO].[LIB].trim_ora(sqlerrm)||
' Документы не созданы!');
end if;
end; |
_________________ всегда есть как минимум 2 выхода |
|
 |
arkazar Участник со стажем
Вступление в Клуб: 27.09.2010
|
Пт Мар 23, 2012 16:42   |
|
Полезность: Нет оценки
|
Спасибо. |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Пн Мар 26, 2012 11:03   |
|
Полезность: 1
|
Alexsey пишет: | перехватить ошибку.. и вывести SQLERRM
например:
Код: | begin
....
exception
when OTHERS then
if v_console then
stdio.put_line_buf ('Ошибка обработки строки выписки № '||this.[NUM_STR]||': '||::[IMS_BO].[LIB].trim_ora(sqlerrm)||
' Документы не созданы!');
end if;
end; |
|
Не совсем согласен.
Я лично перехватываю только нужные мне исключения (ну, если они не выводятся стандартным pragma error, конечно):
Код: |
pragma macro(except, '[1] exception;
[1]_EXCEPTION constant number := [2];
pragma exception_init([1], [2])', substitute);
&except(SNAPSHOT_TOO_OLD, -01555);
&except(PRAGMA_ERROR, -20300);
...
exception when SNAPSHOT_TOO_OLD then
...
when PRAGMA_ERROR then
...
|
Ну и вывожу не только sqlerrm:
Код: |
function errmess return varchar2 is
begin
return 'ошибка '||sqlcode||' {'||sqlerrm||'}. Стек: '||dbms_utility.FORMAT_ERROR_BACKTRACE;
end;
|
|
|
 |
arkazar Участник со стажем
Вступление в Клуб: 27.09.2010
|
Пн Мар 26, 2012 13:37   |
|
Полезность: Нет оценки
|
Я так понял, что sqlerrm выдаёт ошибку pragma error из операции, так? |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Пн Мар 26, 2012 14:05   |
|
Полезность: 3
|
arkazar пишет: | Я так понял, что sqlerrm выдаёт ошибку pragma error из операции, так? |
sqlcode - выводит код исключения (ошибки). Все исключения, сделанные в ЦФТ с помощью pragma error, имеют код ORA-20300
sqlerrm - выводит текстовое сообщение, сопровождающее исключение. Для pragma error - это то, что пишут в скобочках Код: | pragma error('Внимание! Это ошибка.'); |
dbms_utility.FORMAT_ERROR_BACKTRACE - возвращает стэк вызовов до места, где произошло исключение, то есть имена пакетов/функций/процедур/триггеров/анонимных блоков/и т.п. вместе с номерами строк, что является очень полезным для отладки. |
|
 |
arkazar Участник со стажем
Вступление в Клуб: 27.09.2010
|
Сб Апр 28, 2012 11:55   |
|
Полезность: Нет оценки
|
Я реализовал это так
Код: |
exception when others then
debug_pipe(sqlerrm);
|
Но выдаётся не такое сообщение, как в вызываемой в фоновом режиме операции.
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
Т.е. не корректное для пользователя? как в операции
"Нельзя закрыть договор..."
Подскажите,где ошибся? |
|
 |
bizon-86 Участник
Вступление в Клуб: 16.02.2012
|
Вт Май 01, 2012 12:55   |
|
Полезность: Нет оценки
|
arkazar пишет: | Я реализовал это так
Код: |
exception when others then
debug_pipe(sqlerrm);
|
Но выдаётся не такое сообщение, как в вызываемой в фоновом режиме операции.
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
Т.е. не корректное для пользователя? как в операции
"Нельзя закрыть договор..."
Подскажите,где ошибся? |
Налицо ошибка преобразования. Какой-то символ затисался в строку, которую вы явно или неявно преобразовываете в number. format_error_backtrace даст ответ, где именно идет преобразование.
P.s. Лучше debug_pipe(sqlerrm,0); Чтоб наверняка... |
|
 |
|