2016-10-12 9 views
0

私はすぐにOracleセッションを殺す簡単なスクリプトを書いている: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: 

助けてください!

答えて

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; 

また、あなたはカーソルを処理するための変数を宣言する必要はありません。

+0

このクエリで実際に2つの列が返されているため、このエラーはこれでも持続する可能性があります。 2つ目のカラム( 'immediate'を含む)を文としてエイリアスしても、それはうまく実行されません。文字列 'immediate'は、コマンドの残りの部分に連結して、完全なコマンドを1つの列に戻す必要があります。 – DCookie

+0

あなたは絶対に正しいです。私はエラーを気付かずに、私の答えでそれをコピーしました。 – Aleksej

0

構文については、Aleksejは絶対に正しいです。

このクエリは、RACでこれを実行すると、現在のインスタンスでのみセッションが強制終了されることにも注意してください。 sql_idですべてのインスタンスのすべてのセッションを強制終了する必要がある場合は、gv $セッションビューとセッションIDを 'sid、serial#、@ inst_id'の形式で使用する必要があります。

関連する問題