我写了一个简单的脚本,会立即杀死oracle会话:
DECLARE
v_kill VARCHAR2(32767);
BEGIN
FOR v_kill IN
(SELECT
'alter system kill session '''
||sid
||','
||serial#
||'''',
'immediate;'
FROM
v$session
WHERE
sql_id='sql_id_here'
)
LOOP
EXECUTE immediate v_kill;
END LOOP;
END;
不幸的是,我遇到了一个错误,让我遇到了这个问题:
Error report -
ORA-06550: linia 18, kolumna 21:
PLS-00382: expression is of wrong type
ORA-06550: linia 18, kolumna 3:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
任何帮助将不胜感激!
答案 0 :(得分:2)
要以这种方式使用游标,您需要为语句列提供别名并执行:
BEGIN
FOR v_kill IN
(SELECT
'alter system kill session '''
||sid
||','
||serial#
|| ''' immediate;' as statement
FROM
v$session
WHERE
sql_id='sql_id_here'
)
LOOP
dbms_output.put_line (v_kill.statement);
END LOOP;
END;
此外,您不需要声明一个变量来处理游标。
答案 1 :(得分:0)
Aleksej对语法完全正确。
另请注意,如果在RAC中运行此查询,此查询将仅在当前实例中终止会话。 如果您需要绝对确定使用sql_id杀死所有实例上的所有会话,则需要使用'sid,serial#,@ inst_id'形式的gv $ session视图和会话ID。
答案 2 :(得分:0)
SELECT 'alter system kill session ''' ||sid ||','||serial# ||',@'||inst_id||''';' from gv$session where sql_id = '&sql_id'