代码之家  ›  专栏  ›  技术社区  ›  Ryan Ahearn

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

  •  14
  • Ryan Ahearn  · 技术社区  · 16 年前

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

    4 回复  |  直到 16 年前
        1
  •  16
  •   Dave Costa    16 年前

    您必须具有要中断的会话的SID和序列号。

    调用SYS.DBMS\u SYSTEM.SET\u EV( 希德 , ,10237,1“”),以激活目标会话中的事件。应中断任何当前执行的语句(接收“ORA-01013:用户请求取消当前操作”)。只要设置了事件,会话尝试执行的任何其他语句都将立即终止,并出现相同的错误。

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

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

    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;
    
        2
  •  2
  •   cagcowboy    16 年前

    我怀疑这是可能的,因为你可以在蟾蜍身上做这件事。当查询运行时,会出现一个取消对话框,您可以点击该对话框来停止查询。

    如果您使用的是java,则应该使用java.sql.Statement cancel()方法来完成此任务。请参阅此处了解一些注意事项和限制。。。

    http://download.oracle.com/docs/cd/B14117_01/java.101/b10979/tips.htm#BACDAICJ

        3
  •  1
  •   Gary Myers    16 年前

    您可以查看资源限制:

    如果用户超过调用级别资源限制,则Oracle将停止对该语句的处理,回滚该语句,并返回一个错误。但是,当前事务的所有先前语句都保持不变,并且用户的会话保持连接

    这假设取消SQL的原因是资源限制,而不是更新错误的行集(例如)。我怀疑您无法通过添加资源限制来影响当前正在运行的SQL。

    http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/security.htm#i13767
    http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/dbrm.htm#i1010776
    
        4
  •  1
  •   Tanel Poder    13 年前

    理想情况下,用户的应用程序应该能够取消查询(通过OCICancel或等效工具)。

    否则,最好使用资源管理器(如果在Oracle EE上),您可以使用DBMS\u Resource\u Manager.SWITCH\u CONSUMER\u GROUP\u FOR SESS将目标会话设置为CONSUMER GROUP CANCEL\u SQL。

    另一个取消其他会话查询的黑客,虽然不能与sqlplus windows客户端会话一起工作,但可以使用kill-URG向Oracle进程发送紧急信号(这是一个黑客,不适合日常使用)

    我已经写过为什么它在这里工作:

    http://blog.tanelpoder.com/2010/02/17/how-to-cancel-a-query-running-in-another-session/