在PL/SQL或SQL中使用循环杀死oracle会话

Dat*_*ase 2 sql oracle plsql oracle10g oracle11g

我们有这个查询:

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
Run Code Online (Sandbox Code Playgroud)

我需要杀死所有具有相同SQL ID的会话

我不确定如何将各种东西连在一起,但到目前为止我有这个:

for rec in (SELECT se.sid,ss.serial# 
              FROM v$session ss, v$sesstat se, v$statname sn 
             WHERE se.statistic# = sn.statistic# 
               AND name like '%CPU used by this session%' 
               AND se.sid = ss.sid 
               AND ss.status = 'ACTIVE' 
               AND ss.username is not null 
               AND ss.sql_id ='f7frew3erwe'
             ORDER BY value ASC) loop
  ALTER SYSTEM KILL SESSION 'rec.sid,rec.serial#' IMMEDIATE; //this is the tricky part!
end loop;
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Ben*_*Ben 6

问题类似于如何杀死连接到我的oracle数据库的所有会话?虽然不适用于所有会议.

您需要使用execute immediate以便在PL/SQL块中更改系统:

execute immediate 'Alter System Kill Session '''|| rec.Sid  
                       || ',' || rec.Serial# || ''' IMMEDIATE';
Run Code Online (Sandbox Code Playgroud)

我查询您需要使用所有其他系统表.如果要杀死的所有内容都是特定的,那么类似下面的查询足够了SQL_ID:

SELECT se.sid,ss.serial# 
  FROM v$session
 WHERE status = 'ACTIVE' 
   AND username is not null 
   AND sql_id ='f7frew3erwe'
Run Code Online (Sandbox Code Playgroud)