Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Для чего этот raise / 11 сообщений из 11, страница 1 из 1
02.04.2017, 13:28
    #39431528
П_а_т_р_и_к
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для чего этот raise
ДД! В одной книжке (автор Фейерштейн) приводится такой код:
Код: plsql
1.
2.
3.
4.
5.
6.
1 EXCEPTION
2   WHEN NO_DATA_FOUND
3   THEN 
4          -- Ошибочный идентификатор счета
5         log_error(...);
6         RAISE;

В строке 6 вызывается снова RAISE, зачем?
...
Рейтинг: 0 / 0
02.04.2017, 13:33
    #39431530
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для чего этот raise
П_а_т_р_и_кснова RAISE, зачем?Такова задумка именно этого кода.
http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
02.04.2017, 13:38
    #39431531
П_а_т_р_и_к
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для чего этот raise
ElicП_а_т_р_и_кснова RAISE, зачем?Такова задумка именно этого кода.
http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM Лучше бы не отсылали на три буквы, а ответили на вопрос.
...
Рейтинг: 0 / 0
02.04.2017, 13:54
    #39431537
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для чего этот raise
В том месте задумкой автора предусмотрено только протоколирование именно той исключительной ситуации, но не реакция на неё.
Ещё раз: http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
02.04.2017, 22:44
    #39431714
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для чего этот raise
П_а_т_р_и_кElicпропущено...
Такова задумка именно этого кода.
http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM Лучше бы не отсылали на три буквы, а ответили на вопрос.был у меня случай лет 10 назад
Звонит юзер
Говорит - в одном отчете 100 строк, а в другом 99. Почему?
Оказалось, во втором случае разраб в процедуре заполнения времянки использовал функцию, в которой no_data_found в какой-то ему известный лог данные писал, но рейза как раз не было. Т.е. ошибка была, но на самом деле никто её не видел
...
Рейтинг: 0 / 0
03.04.2017, 17:34
    #39432229
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для чего этот raise
П_а_т_р_и_к,

что-б передать исключение в вызывающую процедуру (ниже уровнем), пусть она принимает решение

в р-нет raise- она при выплнении не генерит исключиние
в p-reise есть, оно переходит в вызывающий блок, котрый логирует и передаю ниже

поексперементируйте и усе уляжется
Код: plsql
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
declare
 procedure p (p_ename varchar2) is
   v varchar2(30);
 begin
   select job into v from emp where ename=p_ename;
  exception
  WHEN NO_DATA_FOUND
  THEN 
          -- Ошибочный идентификатор счета
         --log_error(...); 
         dbms_output.put_line('Нет или увалился '||p_ename); --пишем в лог
  end;
 procedure p_raise (p_ename varchar2) is
   v varchar2(30);
 begin
     select job into v from emp where ename=p_ename;
   exception
   WHEN NO_DATA_FOUND
   THEN 
      -- Ошибочный идентификатор счета
      --log_error(...); 
      dbms_output.put_line('Нет или увалился - '||p_ename); --пишем в лог
      RAISE;
 end;
begin
   p('Stanislav');
   p_raise('Stax'); --переставте вызовы местами
exception
WHEN NO_DATA_FOUND
   THEN 
   dbms_output.put_line('Не знаю что с етим делять, к ДБА пусть разбирается!'); --пишем в лог
   RAISE;
end;
/

  1  declare
  2   procedure p (p_ename varchar2) is
  3     v varchar2(30);
  4   begin
  5     select job into v from emp where ename=p_ename;
  6    exception
  7    WHEN NO_DATA_FOUND
  8    THEN
  9            -- Ошибочный идентификатор счета
 10           --log_error(...);
 11           dbms_output.put_line('Нет или увалился '||p_ename); --пишем в лог
 12    end;
 13   procedure p_raise (p_ename varchar2) is
 14     v varchar2(30);
 15   begin
 16       select job into v from emp where ename=p_ename;
 17     exception
 18     WHEN NO_DATA_FOUND
 19     THEN
 20        -- Ошибочный идентификатор счета
 21        --log_error(...);
 22        dbms_output.put_line('Нет или увалился - '||p_ename); --пишем в лог
 23        RAISE;
 24   end;
 25  begin
 26     p('Stanislav');
 27     p_raise('Stax'); --переставте вызовы местами
 28  exception
 29  WHEN NO_DATA_FOUND
 30     THEN
 31     dbms_output.put_line('Не знаю что с етим делять, к ДБА пусть разбирается!'); --пишем в лог
 32     RAISE;
 33* end;
SQL> /

SQL> /
Нет или увалился Stanislav
Нет или увалился - Stax
Не знаю что с етим делять, к ДБА пусть разбирается!
declare
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 32



.....
stax
...
Рейтинг: 0 / 0
04.04.2017, 08:58
    #39432522
фкдчarlx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для чего этот raise
Stax..,

и еще, с таким raise фигня в том что он место ошибки показывает в своей строке, а не где была ошибка на самом деле.
...
Рейтинг: 0 / 0
04.04.2017, 09:22
    #39432549
Для чего этот raise
фкдчarlxи еще, с таким raise фигня в том что он место ошибки показывает в своей строке, а не где была ошибка на самом деле.ну, а если убрать такой raise из блока exception, где покажет ошибку?
...
Рейтинг: 0 / 0
04.04.2017, 15:01
    #39432948
Vladimir Filin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для чего этот raise
Для адекватной диагностики (ну, или почти адекватной) использую DBMS_UTILITY.format_error_backtrace
Пример:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DECLARE
....
err_code_                       NUMBER; --код ошибки
err_descr_                      VARCHAR2(2048 CHAR); --описание ошибки
td_                             TIMESTAMP; --время начала транзакции
.....
BEGIN
....
 WHEN OTHERS THEN
       err_code_ := SQLCODE;
       err_descr_ := SQLERRM || CHR(10) || DBMS_UTILITY.format_error_backtrace;
       INSERT INTO errlog_logs_abc (aa, bb, cc, err_code, err_descr, td)
            VALUES (aa_, bb_, cc_, err_code_, err_descr_, td_);
END;



Результат:
Код: plsql
1.
2.
3.
4.
5.
6.
ORA-37162: OLAP error
XOQ-01710: unknown build item "A2_CU.DIM_TIME"
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2809
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 3025
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2994
ORA-06512: at "A2_SUPPORT.UTIL_SUPPORT", line 290


Строка 290 действительно соответствует точке возникновения ошибки.
RAISE не использовал -- как правильно указали предшественники, появление RAISE в коде вызовет не только логирование, но прерывание процесса. Фейерштейну нужно было прерывание, мне -- нет.
...
Рейтинг: 0 / 0
04.04.2017, 15:21
    #39432970
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для чего этот raise
Vladimir FilinДля адекватной диагностики (ну, или почти адекватной) использую DBMS_UTILITY.format_error_backtrace
Пример:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DECLARE
....
err_code_                       NUMBER; --код ошибки
err_descr_                      VARCHAR2(2048 CHAR); --описание ошибки
td_                             TIMESTAMP; --время начала транзакции
.....
BEGIN
....
 WHEN OTHERS THEN
       err_code_ := SQLCODE;
       err_descr_ := SQLERRM || CHR(10) || DBMS_UTILITY.format_error_backtrace;
       INSERT INTO errlog_logs_abc (aa, bb, cc, err_code, err_descr, td)
            VALUES (aa_, bb_, cc_, err_code_, err_descr_, td_);
END;




Стесняюсь спросить, а в случае rollback, почти адекватная диагностика Вам не интересна?
...
Рейтинг: 0 / 0
04.04.2017, 16:22
    #39433032
Vladimir Filin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Для чего этот raise
XMLer,
я упрощенный код привёл, только лишь поддерживая тему:
фкдчarlxStax..,
и еще, с таким raise фигня в том что он место ошибки показывает в своей строке, а не где была ошибка на самом деле.
Не более того.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Для чего этот raise / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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