BEGIN
FOR V_SESSID IN (SELECT SESS_ID FROM V$SESSIONS WHERE SQL_TEXT LIKE 'SELECT%')
LOOP
SP_CLOSE_SESSION(V_SESSID.SESS_ID);
END LOOP;
END;
/*
disql 打印日志需要开启,先单独执行;图形化管理工具忽略
*/
--SET SERVEROUTPUT ON;
DECLARE
CURSOR C_SQL;
V_SESSID VARCHAR(32);
V_COUNT VARCHAR(8);
V_TEXT VARCHAR;
TYPE C_SESSION IS REF CURSOR RETURN V$SESSIONS%ROWTYPE;
V_SESSION C_SESSION;
/*
WHERE 对V$SESSIONS 系统视图配置查询条件
根据需求选择WHERE 条件
*/
-- 关闭SELECT 开头的全部会话
V_WHERE VARCHAR(64) := 'WHERE SQL_TEXT LIKE ''SELECT%''';
--V_WHERE VARCHAR(64) := 'WHERE SQL_TEXT LIKE ''select%''';
-- 关闭全部会话
--V_WHERE VARCHAR(64) := 'WHERE SQL_TEXT NOT LIKE ''DECLARE%''';
BEGIN
-- 输出统计符合条件的会话数量
OPEN C_SQL FOR 'SELECT COUNT(*) FROM V$SESSIONS ' || V_WHERE;
LOOP
FETCH C_SQL INTO V_COUNT;
EXIT WHEN C_SQL%NOTFOUND;
PRINT '总计:' || V_COUNT;
END LOOP;
CLOSE C_SQL;
-- 关闭会话,并输出会话的SESS_ID
OPEN C_SQL FOR 'SELECT SESS_ID FROM V$SESSIONS ' || V_WHERE;
LOOP
FETCH C_SQL INTO V_SESSID;
EXIT WHEN C_SQL%NOTFOUND;
PRINT V_SESSID;
SP_CLOSE_SESSION(V_SESSID);
END LOOP;
CLOSE C_SQL;
--输出未关闭的会话
OPEN C_SQL FOR 'SELECT SESS_ID,SQL_TEXT FROM V$SESSIONS ' || V_WHERE;
IF C_SQL%FOUND THEN
LOOP
FETCH C_SQL INTO V_SESSID,V_TEXT;
EXIT WHEN C_SQL%NOTFOUND;
PRINT '未关闭的会话:';
PRINT 'SESS_ID: '||V_SESSID||', V_TEXT: '||V_TEXT;
PRINT '可以重复执行此操作';
END LOOP;
ELSE
PRINT '会话已经全部关闭';
END IF;
CLOSE C_SQL;
--输出全部会话
--SELECT SESS_ID,SQL_TEXT,STATE,RUN_STATUS,USER_NAME,CLNT_TYPE,TIME_ZONE 时区,CREATE_TIME 创建时间,MSG_STATUS,LAST_RECV_TIME 最近接收时间,LAST_SEND_TIME 最近发送时间,CLNT_IP,CLNT_VER,THRD_ID FROM V$SESSIONS;
END;
文章
阅读量
获赞