Znalazłem sztuczkę. Nie mam pojęcia, jak bezpiecznie można się z tym bawić, ale to działa. Istnieje zdarzenie Oracle, 10237, które jest opisane jako „symuluj ^C (w celach testowych)”.
Musisz mieć SID i SERIAL# sesji, którą chcesz przerwać.
Wywołaj SYS.DBMS_SYSTEM.SET_EV( sid , numer seryjny , 10237, 1, '' ), aby aktywować zdarzenie w sesji docelowej. Każda aktualnie wykonywana instrukcja powinna zostać przerwana (otrzymując „ORA-01013:użytkownik zażądał anulowania bieżącej operacji”). Dopóki zdarzenie jest ustawione, wszelkie dalsze instrukcje, które sesja próbuje wykonać, kończą się natychmiast z tym samym błędem.
Aby dezaktywować zdarzenie, wykonaj to samo wywołanie z czwartym parametrem ustawionym na „0”. Sesja będzie wtedy mogła ponownie wykonać instrukcje.
Zauważ, że sesja docelowa musi wykryć, że zdarzenie jest ustawione, co może zająć trochę czasu lub może nigdy nie nastąpić, w zależności od tego, co robi. Nie możesz więc po prostu szybko włączać i wyłączać wydarzenia. Musisz go włączyć, sprawdzić, czy dane oświadczenie zostało zatrzymane, a następnie wyłączyć.
Oto przykładowy kod. To ma być uruchamiane jako anonimowy blok w SQLPlus, z odpowiednio zdefiniowanymi zmiennymi podstawiania "sid" i "serial". Możesz przekształcić go w procedurę składowaną z tymi parametrami.
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;