【发布时间】:2018-11-14 21:52:21
【问题描述】:
我需要终止(杀死)Oracle Db v$session 中的所有会话,其中 status 未处于活动状态
要列出活动和非活动会话,我使用了以下语句:
SELECT sid, serial#, status FROM v$session;
我需要一个声明来终止 status != Active 的会话
【问题讨论】:
标签: oracle session data-dictionary
我需要终止(杀死)Oracle Db v$session 中的所有会话,其中 status 未处于活动状态
要列出活动和非活动会话,我使用了以下语句:
SELECT sid, serial#, status FROM v$session;
我需要一个声明来终止 status != Active 的会话
【问题讨论】:
标签: oracle session data-dictionary
你可以使用下面的块
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;
【讨论】: