Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Czy można zabić pojedyncze zapytanie w Oracle bez zabijania sesji?

Znalazłem sztuczkę. Nie mam pojęcia, jak bezpiecznie można się z tym bawić, ale to działa. Istnieje zdarzenie Oracle, 10237, które jest opisane jako „symuluj ^C (w celach testowych)”.

Musisz mieć SID i SERIAL# sesji, którą chcesz przerwać.

Wywołaj SYS.DBMS_SYSTEM.SET_EV( sid , numer seryjny , 10237, 1, '' ), aby aktywować zdarzenie w sesji docelowej. Każda aktualnie wykonywana instrukcja powinna zostać przerwana (otrzymując „ORA-01013:użytkownik zażądał anulowania bieżącej operacji”). Dopóki zdarzenie jest ustawione, wszelkie dalsze instrukcje, które sesja próbuje wykonać, kończą się natychmiast z tym samym błędem.

Aby dezaktywować zdarzenie, wykonaj to samo wywołanie z czwartym parametrem ustawionym na „0”. Sesja będzie wtedy mogła ponownie wykonać instrukcje.

Zauważ, że sesja docelowa musi wykryć, że zdarzenie jest ustawione, co może zająć trochę czasu lub może nigdy nie nastąpić, w zależności od tego, co robi. Nie możesz więc po prostu szybko włączać i wyłączać wydarzenia. Musisz go włączyć, sprawdzić, czy dane oświadczenie zostało zatrzymane, a następnie wyłączyć.

Oto przykładowy kod. To ma być uruchamiane jako anonimowy blok w SQLPlus, z odpowiednio zdefiniowanymi zmiennymi podstawiania "sid" i "serial". Możesz przekształcić go w procedurę składowaną z tymi parametrami.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak dowiedzieć się, kiedy tabela Oracle była ostatnio aktualizowana?

  2. MySQL COALESCE i funkcja NULLIF

  3. 5 sposobów aktualizacji danych za pomocą podzapytania w Oracle SQL

  4. SQLRecoverableException:Wyjątek we/wy:Resetowanie połączenia

  5. Likwidacja agenta w EM13c