मुझे एक तरकीब मिली। मुझे नहीं पता कि इसके साथ खेलना कितना सुरक्षित है, लेकिन यह काम करता है। एक Oracle घटना है, 10237, जिसे "सिम्युलेट ^C (परीक्षण उद्देश्यों के लिए)" के रूप में वर्णित किया गया है।
आपके पास उस सत्र का SID और SERIAL# होना चाहिए जिसे आप बाधित करना चाहते हैं।
SYS.DBMS_SYSTEM.SET_EV( sid . पर कॉल करें) , धारावाहिक# , 10237, 1, '' ) लक्ष्य सत्र में घटना को सक्रिय करने के लिए। वर्तमान में निष्पादित कोई भी कथन बाधित होना चाहिए ("ORA-01013 प्राप्त करना:उपयोगकर्ता ने वर्तमान संचालन को रद्द करने का अनुरोध किया")। जब तक ईवेंट सेट किया जाता है, सत्र द्वारा निष्पादित करने का प्रयास करने वाला कोई और कथन तुरंत उसी त्रुटि के साथ समाप्त हो जाएगा।
ईवेंट को निष्क्रिय करने के लिए, चौथे पैरामीटर को "0" पर सेट करके वही कॉल करें। सत्र फिर से बयानों को निष्पादित करने में सक्षम होगा।
ध्यान दें कि लक्ष्य सत्र को यह पता लगाना है कि घटना सेट है, जिसमें समय लग सकता है, या कभी नहीं हो सकता है, यह इस बात पर निर्भर करता है कि वह क्या कर रहा है। इसलिए आप ईवेंट को तुरंत चालू और बंद नहीं कर सकते। आपको इसे चालू करना होगा, सत्यापित करना होगा कि विचाराधीन कथन रुक गया है, फिर उसे बंद कर दें।
यहाँ कुछ नमूना कोड है। यह SQLPlus में एक अनाम ब्लॉक के रूप में चलाने के लिए है, प्रतिस्थापन चर "सिड" और "सीरियल" के साथ उचित रूप से परिभाषित किया गया है। आप इसे इसके पैरामीटर के रूप में संग्रहीत कार्यविधि में बदल सकते हैं।
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;