当前位置:  开发笔记 > 数据库 > 正文

是否可以在oracle中杀死单个查询而不会终止会话?

如何解决《是否可以在oracle中杀死单个查询而不会终止会话?》经验,为你挑选了1个好方法。

我希望能够在Oracle 10.2.0.4中终止用户的查询而不会终止整个会话.这将允许查询结束,但不会将该用户记录在其会话之外,因此他们可以继续进行其他查询.这有可能吗?或者是杀死会话的直言不讳是结束查询执行的唯一方法?



1> Dave Costa..:

我找到了一个技巧.我不知道这是多么安全,但确实有效.有一个Oracle事件10237,它被描述为"模拟^ C(用于测试目的)".

您必须具有要中断的会话的SID和SERIAL#.

调用SYS.DBMS_SYSTEM.SET_EV (sid,serial#,10237,1,'')以激活目标会话中的事件.任何当前正在执行的语句都应该被中断(接收"ORA-01013:用户请求取消当前操作").只要事件被设置,会话尝试执行的任何进一步语句将立即以相同的错误终止.

要取消激活该事件,请将第四个参数设置为"0"进行相同的调用.然后会话将能够再次执行语句.

请注意,目标会话必须检测事件是否已设置,这可能需要一段时间,或者可能永远不会发生,具体取决于它正在执行的操作.因此,您无法快速切换事件的开关.您需要将其打开,验证相关语句已停止,然后将其关闭.

这是一些示例代码.这意味着在SQLPlus中作为匿名块运行,并且适当地定义了替换变量"sid"和"serial".您可以将其转换为存储过程,并将其作为参数.

DECLARE
  l_status  v$session.status%TYPE;
BEGIN

  dbms_system.set_ev( &sid, &serial, 10237, 1, '');

  LOOP
    SELECT status INTO l_status FROM v$session
      WHERE sid = &sid and serial# = &serial;
    EXIT WHEN l_status='INACTIVE';
  END LOOP;

  dbms_system.set_ev( &sid, &serial, 10237, 0, '');
END;

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有