powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как перехватить все исключения?
5 сообщений из 30, страница 2 из 2
как перехватить все исключения?
    #40064443
legg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
AlexFF__|

Чтобы сделать что-нибудь нужно иметь управление, а если клиент завершает CALL, например по Ora-01013, исполнение текущего кода прерывается.
При этом сама сессия может оставаться в добром здравии и готова к дальнейшим действиям.


Именно.

Код: 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.
SQL> create or replace
  2    package pkg1
  3      is
  4          g_lockname   varchar2(128);
  5          g_lockhandle varchar2(128);
  6          procedure p1;
  7  end;
  8  /

Package created.

SQL> create or replace
  2    package body pkg1
  3      is
  4        procedure p1
  5          is
  6              e exception;
  7              pragma exception_init(e,-1013);
  8          begin
  9              g_lockname := 'user_lock';
 10              dbms_lock.allocate_unique(
 11                                        lockname   => g_lockname,
 12                                        lockhandle => g_lockhandle
 13                                       );
 14              raise e;
 15            exception
 16              when others
 17               then
 18                  dbms_output.put_line('P1: ' || sqlerrm);
 19      end;
 20  end;
 21  /

Package body created.

SQL> create or replace
  2    procedure p2
  3      is
  4      begin
  5          pkg1.p1;
  6        exception
  7          when others
  8            then
  9              dbms_output.put_line('P2: ' || sqlerrm);
 10  end;
 11  /

Procedure created.

SQL> set serveroutput on
SQL> exec p2
BEGIN p2; END;

*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
ORA-06512: at "SCOTT.PKG1", line 13
ORA-06512: at "SCOTT.P2", line 4
ORA-06512: at line 1


SQL> declare
  2      v_retval integer;
  3  begin
  4      v_retval := dbms_lock.release(
  5                                    lockhandle => pkg1.g_lockhandle
  6                                   );
  7  end;
  8  /

PL/SQL procedure successfully completed.

SQL>




SY.

ну нет же. если клиент инициирует ORA-01013: user requested cancel of current operation
то процедура может сохранить управление обработав адресно ORA-01013 . Можно вообще ее подавить и продолжить работу
...
Рейтинг: 0 / 0
как перехватить все исключения?
    #40064468
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
legg

ну нет же. если клиент инициирует ORA-01013: user requested cancel of current operation
то процедура может сохранить управление обработав адресно ORA-01013 . Можно вообще ее подавить и продолжить работу


Это как? Посмотри внимательно на пример: клиент (SQL*Plus) вызывает процедуру P2 которая в свою очередь вызывает процедуру PKG1.P1. Обе процедуры имеют exception блок на when others. Во время выполнения PKG1.P1 имитируем ORA-01013. Ни один exception блок её не ловит - мы вылетаем прямиком к клиенту. Посему если PKG1.P1 и/или P2 могут в случае ORA-01013 оставить приложение в "незавершенном" состоянии то проверить это может только клиент.

SY.
...
Рейтинг: 0 / 0
как перехватить все исключения?
    #40064474
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще одно место где можно отловить ORA-01013 это AFTER SERVERERROR триггер:

Код: 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.
SQL> create or replace
  2    trigger after_servererror
  3    after servererror
  4    on database
  5    begin
  6        dbms_output.put_line('Fire!');
  7  end;
  8  /

Trigger created.

SQL> set serveroutput on
SQL> exec p2
Fire!
BEGIN p2; END;

*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
ORA-06512: at "SCOTT.PKG1", line 13
ORA-06512: at "SCOTT.P2", line 4
ORA-06512: at line 1


SQL> declare
  2      v_retval integer;
  3  begin
  4      v_retval := dbms_lock.release(
  5                                    lockhandle => pkg1.g_lockhandle
  6                                   );
  7  end;
  8  /

PL/SQL procedure successfully completed.

SQL>



SY.
...
Рейтинг: 0 / 0
как перехватить все исключения?
    #40064475
legg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
legg

ну нет же. если клиент инициирует ORA-01013: user requested cancel of current operation
то процедура может сохранить управление обработав адресно ORA-01013 . Можно вообще ее подавить и продолжить работу


Это как? Посмотри внимательно на пример: клиент (SQL*Plus) вызывает процедуру P2 которая в свою очередь вызывает процедуру PKG1.P1. Обе процедуры имеют exception блок на when others. Во время выполнения PKG1.P1 имитируем ORA-01013. Ни один exception блок её не ловит - мы вылетаем прямиком к клиенту. Посему если PKG1.P1 и/или P2 могут в случае ORA-01013 оставить приложение в "незавершенном" состоянии то проверить это может только клиент.

SY.

так и я о том :)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DECLARE
   e_1013 EXCEPTION;
   PRAGMA EXCEPTION_INIT(e_1013, -1013);
BEGIN
    BEGIN
          RAISE e_1013;
    EXCEPTION WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE('сюда не попадем');
    END;

EXCEPTION WHEN e_1013 THEN
    DBMS_OUTPUT.PUT_LINE('но попадем сюда');
END;
/



01013 не ловится WHEN others но ловится WHEN e_1013
...
Рейтинг: 0 / 0
как перехватить все исключения?
    #40064476
legg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Код: plsql
1.
2.
3.
4.
5.
create or replace
  2    trigger after_servererror
  3    after servererror
  4    on database
  5    begin


а вот это прикольно, спасибо. буду знать о такой возможности
...
Рейтинг: 0 / 0
5 сообщений из 30, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как перехватить все исключения?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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