sql >> Database teknologi >  >> RDS >> Oracle

Er det muligt at dræbe en enkelt forespørgsel i oracle uden at dræbe sessionen?

Jeg fandt et trick. Jeg aner ikke hvor sikkert det er at lege med, men det virker. Der er en Oracle-begivenhed, 10237, som beskrives som "simuler ^C (til testformål)".

Du skal have SID og SERIE# for den session, du vil afbryde.

Kald SYS.DBMS_SYSTEM.SET_EV( sid , serienummer , 10237, 1, '' ) for at aktivere hændelsen i målsessionen. Enhver sætning, der udføres i øjeblikket, skal afbrydes (modtager "ORA-01013:bruger anmodet om annullering af nuværende handling"). Så længe hændelsen er indstillet, vil eventuelle yderligere sætninger, som sessionen forsøger at udføre, straks afsluttes med den samme fejl.

For at deaktivere hændelsen skal du foretage det samme opkald med den fjerde parameter sat til "0". Sessionen vil derefter være i stand til at udføre sætninger igen.

Bemærk, at målsessionen skal registrere, at hændelsen er indstillet, hvilket kan tage tid eller måske aldrig vil ske, afhængigt af hvad den gør. Så du kan ikke bare hurtigt slå begivenheden til og fra. Du skal slå den til, bekræfte, at den pågældende erklæring er stoppet, og derefter slå den fra.

Her er et eksempel på kode. Dette er beregnet til at blive kørt som en anonym blok i SQLPlus, med substitutionsvariabler "sid" og "seriel" defineret korrekt. Du kan lave det om til en lagret procedure med dem som parametre.

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. Sådan får du de seneste funktioner i Office 365

  2. MySQL strip ikke-numeriske tegn for at sammenligne

  3. Sådan indsættes i Array i PostgreSQL

  4. Sådan opretter du kun en tabel, hvis den ikke findes i SQLite