जवाबों:
आप ऐसा कर सकते हैं DBMS_LOCK
और एक विशेष ताला।
निम्नलिखित प्रक्रिया देखें:
CREATE OR REPLACE PROCEDURE myproc
IS
lockhandle VARCHAR2(128);
retcode NUMBER;
BEGIN
DBMS_LOCK.ALLOCATE_UNIQUE('myproclock',lockhandle);
retcode:=DBMS_LOCK.REQUEST(lockhandle,timeout=>0, lockmode=>DBMS_LOCK.x_mode);
IF retcode<>0
THEN
raise_application_error(-20000,'myproc is already running');
END IF;
/* sleep so that we can test with a 2nd execution */
DBMS_LOCK.sleep(1000);
retcode:=DBMS_LOCK.RELEASE(lockhandle);
END myproc;
/
टेस्ट (सत्र 1):
SQL> BEGIN
2 myproc();
3 END;
4 /
(स्पष्ट रूप से जब DBMS_LOCK.sleep()
रिटर्न देता है)।
टेस्ट (सत्र 2):
SQL> BEGIN
2 myproc();
3 END;
4 /
BEGIN
*
ERROR at line 1:
ORA-20000: myproc is already running
ORA-06512: at "PHIL.MYPROC", line 12
ORA-06512: at line 2
SQL>
जाहिर है आप की जरूरत है GRANT EXECUTE ON DBMS_LOCK TO YOURUSER;
।
'लॉक' तालिका का उपयोग करें।
जब प्रक्रिया एक ज्ञात मूल्य के लिए तालिका की जांच करना शुरू करती है, यदि वर्तमान में आगे नहीं निकलती है और खरीद से बाहर निकलती है। यदि वहाँ नहीं है, तो तालिका में मान लिखें, प्रक्रिया निष्पादित करें, फिर मान हटाएं और सामान्य रूप से बाहर निकलें।
जब मेरे ग्राहकों से अनुरोध है कि इस तरह का अनोखा व्यावसायिक तर्क है, तो मैं सवाल को घुमाकर पूछ रहा हूं कि इसकी आवश्यकता क्यों है।
यह सुनिश्चित करने का सबसे अच्छा तरीका है कि केवल एक प्रति चल रही है, उपयोगकर्ताओं को प्रक्रिया पर बिल्कुल भी अमल नहीं करने देना है। यदि यह प्रक्रिया इतनी विशेष है तो इसका उपयोग dba / Developers के लिए प्रतिबंधित होना चाहिए।
दूसरा तरीका केवल इस प्रक्रिया को नौकरी के रूप में चलाना है। यह देखने के लिए कि क्या कोई कॉलिंग जॉब चल रही है, प्रक्रिया में एक चेक जोड़ें। यदि वे फिर आगे की प्रक्रिया को रोकते हैं और घटना को लॉग करते हैं।