Oracle - 用于立即会话终止的脚本(我收到错误!)

时间:2016-10-12 06:12:28

标签: sql oracle plsql

我写了一个简单的脚本,会立即杀死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:

任何帮助将不胜感激!

3 个答案:

答案 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'