gpt4 book ai didi

oracle - 是否可以在不终止 session 的情况下终止 oracle 中的单个查询?

转载 作者:行者123 更新时间:2023-12-03 20:26:45 26 4
gpt4 key购买 nike

我希望能够在不终止整个 session 的情况下终止 Oracle 10.2.0.4 中的用户查询。这将允许查询结束,但不会将该用户从其 session 中注销,以便他们可以继续进行其他查询。这可能吗?或者杀死 session 的钝锤是结束查询执行的唯一方法?

最佳答案

我发现了一个技巧。我不知道这玩起来有多安全,但它确实有效。有一个 Oracle 事件 10237,它被描述为“模拟 ^C(用于测试目的)”。

您必须拥有要中断的 session 的 SID 和 SERIAL#。

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

要停用该事件,请在第四个参数设置为“0”的情况下进行相同的调用。然后 session 将能够再次执行语句。

请注意,目标 session 必须检测到事件已设置,这可能需要一些时间,也可能永远不会发生,具体取决于它在做什么。所以你不能只是快速打开和关闭事件。您需要将其打开,确认相关语句已停止,然后将其关闭。

这是一些示例代码。这意味着在 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;

关于oracle - 是否可以在不终止 session 的情况下终止 oracle 中的单个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/466963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com