Как обработать ORA-00028 «ваш сеанс был убит» в Oracle 12c (12.2.0.1.0)? - PullRequest
2 голосов
/ 10 ноября 2019

Проблема в том, что обработка ошибки ORA-00028 довольно сложна. Пожалуйста, посмотрите на приведенный ниже код.

Если вы запускаете proc1 в сеансе 1 и, пока он все еще работает, вы завершаете сеанс 1 с помощью ALTER SYSTEM KILL SESSION, тогда вы получаете сообщение об ошибке ORA-00028 и нет строки в таблице llog. Если вы запустите proc1 и дадите ему завершить (1 мин), тогда обработка ошибок работает, как ожидалось, и вы не получите сообщение об ошибке и 1 строку в таблице llog. Но забавно то, что если после этого вы снова запустите proc1 и завершите сеанс, вы не получите сообщение об ошибке (обработано ORA-00028) и еще одну строку в таблице llog.

Так что для обработки ORA-00028в исключительной ситуации сначала нужно отловить какую-то другую ошибку. Кажется, это ошибка. Кто-нибудь сталкивался с этой проблемой?

/* creating simple table with logs */

create table llog(time timestamp, error varchar2(4000));
/

/* creating package */

create or replace package my_pack
is
       procedure proc1;
end;
/
/* creating package body*/

create or replace package body my_pack
is

e_session_killed EXCEPTION;
PRAGMA EXCEPTION_INIT(e_session_killed, -00028);


procedure error_log (time llog.time%type, error llog.error%type) is
  pragma autonomous_transaction;
begin
  insert into llog values (time, error); 
  commit;
end;


procedure proc1 is
begin

  dbms_lock.sleep(60);

  raise too_many_rows;

  exception
    when e_session_killed then
      error_log(systimestamp, sqlerrm);

    when others then
      error_log(systimestamp, sqlerrm);

end;

end;

1 Ответ

0 голосов
/ 11 ноября 2019

Вы не можете поймать сеанс убийства. Он прерывает текущую операцию (насколько это возможно - могут быть некоторые операции низкого уровня, которые вызывают проблемы), откатывая открытые транзакции. Как только откат завершен, клиенту говорят, что он отключен (при условии, что клиент все еще там), и процесс уходит.

Существует пара вариантов kill session , которые влияют напорядок тех, но вы не сможете вставить что-либо в таблицу из прерванного сеанса.

Единственное исключение может быть через ссылку на базу данных или подобное, когда у вас фактически есть два отдельных сеанса / процесса, происходящих одновременно.

...