Achei um truque. Eu não tenho ideia de como isso é seguro para brincar, mas funciona. Existe um evento Oracle, 10237, que é descrito como "simular ^C (para fins de teste)".
Você precisa ter o SID e o SERIAL# da sessão que deseja interromper.
Chame SYS.DBMS_SYSTEM.SET_EV( sid , série# , 10237, 1, '' ) para ativar o evento na sessão de destino. Qualquer instrução atualmente em execução deve ser interrompida (recebendo "ORA-01013:usuário solicitou cancelamento da operação atual"). Enquanto o evento estiver definido, quaisquer outras instruções que a sessão tentar executar terminarão imediatamente com o mesmo erro.
Para desativar o evento, faça a mesma chamada com o quarto parâmetro definido em "0". A sessão poderá então executar instruções novamente.
Observe que a sessão de destino precisa detectar que o evento está definido, o que pode levar tempo ou nunca acontecer, dependendo do que está fazendo. Portanto, você não pode simplesmente ativar e desativar o evento rapidamente. Você precisaria ativá-lo, verificar se a instrução em questão parou e, em seguida, desativá-lo.
Aqui está um código de exemplo. Isso deve ser executado como um bloco anônimo no SQLPlus, com as variáveis de substituição "sid" e "serial" definidas adequadamente. Você pode transformá-lo em um procedimento armazenado com esses parâmetros.
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;