Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

É possível matar uma única consulta no oracle sem matar a sessão?


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;