Намерих трик. Нямам представа колко безопасно е да се играе с това, но работи. Има събитие на Oracle, 10237, което е описано като „симулиране на ^C (за целите на тестване)“.
Трябва да имате SID и SERIAL# на сесията, която искате да прекъснете.
Обадете се на SYS.DBMS_SYSTEM.SET_EV( sid , сериен № , 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;