首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Oracle12c (12.2.0.1.0)中处理ORA-00028“您的会话已被终止”?

如何在Oracle12c (12.2.0.1.0)中处理ORA-00028“您的会话已被终止”?
EN

Stack Overflow用户
提问于 2019-11-10 21:50:50
回答 1查看 2.2K关注 0票数 2

问题是,处理错误ORA-00028有点棘手。请看下面的代码。

如果在会话1中运行proc1,而它仍在运行,则使用ALTER SYSTEM kill session终止会话1,则会得到ORA-00028错误消息,并且llog表中没有行。如果您运行proc1并让它完成(1分钟),那么错误处理将按预期工作,并且您不会得到任何错误消息,并且在llog表中显示1行。但有趣的是,如果在此之后再次运行proc1并终止该会话,则不会收到错误消息(ORA-00028已处理),并且在llog表中还会显示一行。

因此,对于要在异常子句中处理的ORA-00028,您需要首先捕获一些其他错误。这似乎是个bug。有没有人遇到过这个问题?

代码语言:javascript
复制
/* 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;
EN

回答 1

Stack Overflow用户

发布于 2019-11-11 10:04:38

你不可能捕捉到一次终止会话。它会中断当前操作(尽可能多地中断--可能有一些低级操作会导致问题),回滚打开的事务。一旦回滚完成,客户端就会被告知它已断开连接(假设客户端仍然在那里),该过程就会消失。

kill session有几个变体可以影响它们的顺序,但是您不能从一个被终止的会话中向任何表中插入任何内容。

唯一的例外可能是通过数据库链接或类似的方式,您实际上同时有两个单独的会话/进程在运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58789310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档