如何终止仅处于非活动状态的 Oracle 数据库会话?

How To Kill Oracle DB Sessions Who are inActive Only?

我需要终止(杀死)Oracle Db v$session 中的所有会话,其中 status 未处于活动状态
要列出活动和非活动会话,我使用了以下语句:

SELECT sid, serial#, status FROM v$session;

我需要一个语句来终止状态为 != Active

的会话

您可以使用以下区块

declare
  v_command varchar2(500);
begin
  for c in (
            select sid, serial#, machine, module, username, client_info, status, inst_id
              from gv$session v
             where v.status != 'ACTIVE'
             --and v.inst_id = '&i_inst_id'
              order by username
            ) 
  loop
   begin          
      v_command := 'alter system kill session ''' || c.sid || ',' ||c.serial# ||  
                   ',@'||to_char(c.inst_id)||''' immediate';   
     execute immediate v_command;
    exception when others then dbms_output.put_line(sqlerrm); 
   end; 
  end loop;
end;

其中 v$session 替换为 gv$session 动态性能视图,并且 INST_ID 列排序规则带有实例编号参数,用于 RAC DB 例。也就是说,即使您有一个单实例数据库,也可能会使用上面的代码。

只有一种方法可以终止会话,即 'sid,serial#'
这是一个声明,例如:

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

所以我们需要通过一个循环来为所有人执行此语句 'sid,serial#' 但仅当 status!=active 时: 此代码可以解决此问题:

BEGIN
  FOR sess IN (select sid,serial# from v$session where status<>'ACTIVE')
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || sess.sid  || ',' 
        || sess.serial# || ''' immediate';
  END LOOP;
END;