Ik heb een truc gevonden. Ik heb geen idee hoe veilig dit is om mee te spelen, maar het werkt wel. Er is een Oracle-gebeurtenis, 10237, die wordt beschreven als "simuleer ^C (voor testdoeleinden)".
U moet de SID en SERIAL# hebben van de sessie die u wilt onderbreken.
Roep SYS.DBMS_SYSTEM.SET_EV( sid , serienummer , 10237, 1, '' ) om de gebeurtenis in de doelsessie te activeren. Elke instructie die momenteel wordt uitgevoerd, moet worden onderbroken (ontvangst "ORA-01013:door gebruiker gevraagde annulering van huidige bewerking"). Zolang de gebeurtenis is ingesteld, worden alle verdere instructies die de sessie probeert uit te voeren onmiddellijk beëindigd met dezelfde fout.
Om de gebeurtenis te deactiveren, maakt u dezelfde oproep met de vierde parameter ingesteld op "0". De sessie kan dan opnieuw instructies uitvoeren.
Merk op dat de doelsessie moet detecteren dat de gebeurtenis is ingesteld, wat enige tijd kan duren of misschien nooit zal gebeuren, afhankelijk van wat het doet. Je kunt de gebeurtenis dus niet zomaar even aan- en uitzetten. U zou het moeten inschakelen, controleren of de betreffende verklaring is gestopt en vervolgens uitschakelen.
Hier is wat voorbeeldcode. Dit is bedoeld om te worden uitgevoerd als een anoniem blok in SQLPlus, waarbij de vervangingsvariabelen "sid" en "serial" op de juiste manier zijn gedefinieerd. Je zou er een opgeslagen procedure van kunnen maken met deze als parameters.
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;