Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Ist es möglich, eine einzelne Abfrage in Oracle zu beenden, ohne die Sitzung zu beenden?

Ich habe einen Trick gefunden. Ich habe keine Ahnung, wie sicher das ist, damit zu spielen, aber es funktioniert. Es gibt ein Oracle-Ereignis, 10237, das als "^C simulieren (für Testzwecke)" beschrieben wird.

Sie müssen die SID und SERIAL# der Sitzung haben, die Sie unterbrechen möchten.

Rufen Sie SYS.DBMS_SYSTEM.SET_EV( sid auf , Seriennummer , 10237, 1, '' ), um das Ereignis in der Zielsitzung zu aktivieren. Jede gerade ausgeführte Anweisung sollte unterbrochen werden (Empfang von "ORA-01013:Benutzer forderte Abbruch der aktuellen Operation"). Solange das Ereignis gesetzt ist, werden alle weiteren Anweisungen, die die Sitzung auszuführen versucht, sofort mit demselben Fehler beendet.

Um das Ereignis zu deaktivieren, führen Sie den gleichen Aufruf durch, wobei der vierte Parameter auf „0“ gesetzt ist. Die Sitzung kann dann wieder Anweisungen ausführen.

Beachten Sie, dass die Zielsitzung erkennen muss, dass das Ereignis gesetzt ist, was einige Zeit dauern oder niemals passieren kann, je nachdem, was sie tut. Sie können das Ereignis also nicht einfach schnell ein- und ausschalten. Sie müssten es einschalten, überprüfen, ob die fragliche Anweisung beendet wurde, und es dann ausschalten.

Hier ist ein Beispielcode. Dies soll als anonymer Block in SQLPlus ausgeführt werden, wobei die Substitutionsvariablen "sid" und "serial" entsprechend definiert sind. Sie könnten es in eine gespeicherte Prozedur mit diesen Parametern umwandeln.

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;