Я нашел трюк. Я понятия не имею, насколько безопасно играть, но это работает. Существует событие Oracle 10237, которое описывается как «имитация ^ C (для целей тестирования)».
У вас должны быть SID и SERIAL # сеанса, который вы хотите прервать.
Вызовите SYS.DBMS_SYSTEM.SET_EV ( sid , serial # , 10237, 1, ''), чтобы активировать событие в целевом сеансе. Любой выполняемый в данный момент оператор должен быть прерван (получая «ORA-01013: пользователь запросил отмену текущей операции»). Пока событие установлено, любые дальнейшие операторы, которые пытается выполнить сеанс, будут немедленно прекращены с той же ошибкой.
Чтобы деактивировать событие, выполните тот же вызов с четвертым параметром, установленным в «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;