sql >> データベース >  >> RDS >> Oracle

セッションを強制終了せずに、Oracleで単一のクエリを強制終了することは可能ですか?

    トリックを見つけました。これがどれほど安全かはわかりませんが、機能します。 Oracleイベント10237があり、これは「^ Cをシミュレートする(テスト目的で)」と説明されています。

    中断するセッションのSIDとSERIAL#が必要です。

    SYS.DBMS_SYSTEM.SET_EV( sid serial# 、10237、1、'')ターゲットセッションでイベントをアクティブ化します。現在実行中のステートメントはすべて中断する必要があります(「ORA-01013:ユーザーが現在の操作のキャンセルを要求しました」を受信)。イベントが設定されている限り、セッションが実行しようとするそれ以降のステートメントは、同じエラーですぐに終了します。

    イベントを非アクティブ化するには、4番目のパラメーターを「0」に設定して同じ呼び出しを行います。その後、セッションはステートメントを再度実行できるようになります。

    ターゲットセッションは、イベントが設定されていることを検出する必要があることに注意してください。これは、実行内容に応じて、時間がかかる場合と発生しない場合があります。そのため、イベントのオンとオフをすばやく切り替えることはできません。オンにし、問題のステートメントが停止していることを確認してから、オフにする必要があります。

    ここにいくつかのサンプルコードがあります。これは、SQLPlusで匿名ブロックとして実行され、置換変数「sid」と「serial」が適切に定義されていることを意味します。それらをパラメータとしてストアドプロシージャに変換できます。

    DECLARE
      l_status  v$session.status%TYPE;
    BEGIN
    
      dbms_system.set_ev( &sid, &serial, 10237, 1, '');
    
      LOOP
        SELECT status INTO l_status FROM v$session
          WHERE sid = &sid and serial# = &serial;
        EXIT WHEN l_status='INACTIVE';
      END LOOP;
    
      dbms_system.set_ev( &sid, &serial, 10237, 0, '');
    END;
    


    1. MySQLでデータベースの文字セットと照合を設定する方法

    2. SQLTとパーティショニング

    3. 複数の結合を行う場合のtmpテーブルのMySQLの誤ったキーファイル

    4. データが含まれているときに列タイプを数値からvarchar2に変更するOracleSQL