sql >> Databáze >  >> RDS >> Oracle

Je možné zabít jeden dotaz v oracle bez zabití relace?

Našel jsem trik. Nemám ponětí, jak bezpečné je to hrát, ale funguje to. Existuje událost Oracle, 10237, která je popsána jako „simulovat ^C (pro testovací účely)“.

Musíte mít SID a SERIAL# relace, kterou chcete přerušit.

Zavolejte SYS.DBMS_SYSTEM.SET_EV( sid , serial# , 10237, 1, '' ) pro aktivaci události v cílové relaci. Jakýkoli aktuálně prováděný příkaz by měl být přerušen (přijetí "ORA-01013:uživatel požádal o zrušení aktuální operace"). Dokud je událost nastavena, všechny další příkazy, které se relace pokusí provést, se okamžitě ukončí se stejnou chybou.

Pro deaktivaci události proveďte stejné volání se čtvrtým parametrem nastaveným na "0". Relace pak bude moci znovu provádět příkazy.

Všimněte si, že cílová relace musí detekovat, že událost je nastavena, což může nějakou dobu trvat nebo se nemusí nikdy stát, v závislosti na tom, co dělá. Událost tedy nelze jen rychle zapínat a vypínat. Budete jej muset zapnout, ověřit, že se dotyčný příkaz zastavil, a poté jej vypnout.

Zde je nějaký ukázkový kód. To má být spuštěno jako anonymní blok v SQLPlus se substitučními proměnnými "sid" a "serial" odpovídajícím způsobem. Můžete ji změnit na uloženou proceduru s těmito parametry.

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. Získání opravných sad databáze

  2. Chyba intarray Postgresql:nedefinovaný symbol:pfree

  3. FILE_ID() vs FILE_IDEX() v SQL Server:Jaký je rozdíl?

  4. PDO více dotazů