トリックを見つけました。これがどれほど安全かはわかりませんが、機能します。 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;