sql >> Base de Datos >  >> RDS >> Oracle

¿Es posible eliminar una sola consulta en Oracle sin eliminar la sesión?

Encontré un truco. No tengo idea de cuán seguro es jugar con esto, pero funciona. Hay un evento de Oracle, 10237, que se describe como "simular ^C (para fines de prueba)".

Debe tener el SID y el número de SERIE de la sesión que desea interrumpir.

Llame a SYS.DBMS_SYSTEM.SET_EV( sid , número de serie , 10237, 1, '' ) para activar el evento en la sesión de destino. Cualquier declaración que se esté ejecutando actualmente debe interrumpirse (recibiendo "ORA-01013:el usuario solicitó cancelar la operación actual"). Siempre que se establezca el evento, cualquier declaración adicional que la sesión intente ejecutar terminará inmediatamente con el mismo error.

Para desactivar el evento, haga la misma llamada con el cuarto parámetro puesto a "0". La sesión podrá ejecutar declaraciones nuevamente.

Tenga en cuenta que la sesión de destino tiene que detectar que el evento está configurado, lo que puede llevar tiempo o puede que nunca suceda, según lo que esté haciendo. Por lo tanto, no puede simplemente activar y desactivar rápidamente el evento. Deberá activarlo, verificar que la declaración en cuestión se haya detenido y luego desactivarlo.

Aquí hay un código de muestra. Esto está destinado a ejecutarse como un bloque anónimo en SQLPlus, con las variables de sustitución "sid" y "serial" definidas adecuadamente. Podría convertirlo en un procedimiento almacenado con esos como sus 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;