sql >> Database >  >> RDS >> Oracle

Is het mogelijk om een ​​enkele query in orakel te beëindigen zonder de sessie te beëindigen?

Ik heb een truc gevonden. Ik heb geen idee hoe veilig dit is om mee te spelen, maar het werkt wel. Er is een Oracle-gebeurtenis, 10237, die wordt beschreven als "simuleer ^C (voor testdoeleinden)".

U moet de SID en SERIAL# hebben van de sessie die u wilt onderbreken.

Roep SYS.DBMS_SYSTEM.SET_EV( sid , serienummer , 10237, 1, '' ) om de gebeurtenis in de doelsessie te activeren. Elke instructie die momenteel wordt uitgevoerd, moet worden onderbroken (ontvangst "ORA-01013:door gebruiker gevraagde annulering van huidige bewerking"). Zolang de gebeurtenis is ingesteld, worden alle verdere instructies die de sessie probeert uit te voeren onmiddellijk beëindigd met dezelfde fout.

Om de gebeurtenis te deactiveren, maakt u dezelfde oproep met de vierde parameter ingesteld op "0". De sessie kan dan opnieuw instructies uitvoeren.

Merk op dat de doelsessie moet detecteren dat de gebeurtenis is ingesteld, wat enige tijd kan duren of misschien nooit zal gebeuren, afhankelijk van wat het doet. Je kunt de gebeurtenis dus niet zomaar even aan- en uitzetten. U zou het moeten inschakelen, controleren of de betreffende verklaring is gestopt en vervolgens uitschakelen.

Hier is wat voorbeeldcode. Dit is bedoeld om te worden uitgevoerd als een anoniem blok in SQLPlus, waarbij de vervangingsvariabelen "sid" en "serial" op de juiste manier zijn gedefinieerd. Je zou er een opgeslagen procedure van kunnen maken met deze als parameters.

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. PostgreSQL LIKE prestatievariaties voor query's

  2. Onbekende kolom in 'veldlijst'-fout op MySQL Update-query

  3. Oracle Forms and Reports 11g versie 2 installeren

  4. Hoe maak je een gebruiker/database in script voor Docker Postgres