sql >> Databasteknik >  >> RDS >> Oracle

Är det möjligt att döda en enda fråga i Oracle utan att döda sessionen?

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;


  1. Hur man undviker variabelsubstitution i Oracle SQL Developer med "trinidad &tobago"

  2. Varför respekterar inte PL/SQL privilegier som ges av roller?

  3. Android studio getSlotFromBufferLocked:okänt buffertfel

  4. Dela upp kommaseparerade värden till kolumner i Oracle