Jag hittade ett knep. Jag har ingen aning om hur säkert det här är att leka med, men det fungerar. Det finns en Oracle-händelse, 10237, som beskrivs som "simulera ^C (för teständamål)".
Du måste ha SID och SERIAL# för den session du vill avbryta.
Ring SYS.DBMS_SYSTEM.SET_EV( sid , serienummer , 10237, 1, '' ) för att aktivera händelsen i målsessionen. Alla program som körs för närvarande bör avbrytas (mottager "ORA-01013:användaren begärde avbrytning av aktuell operation"). Så länge som händelsen är inställd kommer alla ytterligare uttalanden som sessionen försöker köra att omedelbart avslutas med samma fel.
För att avaktivera händelsen, gör samma anrop med den fjärde parametern inställd på "0". Sessionen kommer då att kunna köra satser igen.
Observera att målsessionen måste upptäcka att händelsen är inställd, vilket kan ta tid, eller kanske aldrig inträffar, beroende på vad den gör. Så du kan inte bara snabbt slå på och av händelsen. Du skulle behöva slå på den, verifiera att uttalandet i fråga har stoppats och sedan stänga av det.
Här är lite exempelkod. Detta är tänkt att köras som ett anonymt block i SQLPlus, med substitutionsvariablerna "sid" och "serial" definierade på lämpligt sätt. Du kan förvandla det till en lagrad procedur med dessa som parametrar.
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;