加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

可以在oracle中杀死单个查询,而不会杀死会话?

发布时间:2020-12-12 13:48:31 所属栏目:百科 来源:网络整理
导读:我想能够在Oracle 10.2.0.4中杀死用户的查询,而不会杀死他们的整个会话.这将允许查询结束,但不会将该用户记录在其会话之外,因此可以继续进行其他查询.这是可能的吗还是杀死会话的钝锤是结束查询执行的唯一方法? 我发现了一个伎俩.我不知道这是多么安全,但它
我想能够在Oracle 10.2.0.4中杀死用户的查询,而不会杀死他们的整个会话.这将允许查询结束,但不会将该用户记录在其会话之外,因此可以继续进行其他查询.这是可能的吗还是杀死会话的钝锤是结束查询执行的唯一方法? 我发现了一个伎俩.我不知道这是多么安全,但它是有效的.有一个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,'');

  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,'');
END;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读