अपवाद प्रबंधन के लिए आप दो मुख्य पैटर्न लागू कर सकते हैं; "आप छलांग लगाने से पहले देखें" (एलबीवाईएल) और "अनुमति की तुलना में क्षमा मांगना आसान है" (ईएएफपी)। LBYL यह देखने के लिए जाँच करने की वकालत करेगा कि क्या नौकरी छोड़ने का प्रयास करने से पहले यह मौजूद है। ईएएफपी में नौकरी छोड़ने का प्रयास करना और फिर उस विशिष्ट त्रुटि को पकड़ना और अनदेखा करना शामिल होगा, यदि ऐसा होता है।
यदि आप एलबीवाईएल लागू करते हैं तो आप सिस्टम दृश्य को क्वेरी कर सकते हैं USER_SCHEDULER_JOBS
यह देखने के लिए कि क्या आपकी नौकरी मौजूद है। अगर ऐसा होता है, तो उसे छोड़ दें।
declare
l_job_exists number;
begin
select count(*) into l_job_exists
from user_scheduler_jobs
where job_name = 'STATISTICS_COLUMNS_JOB'
;
if l_job_exists = 1 then
dbms_scheduler.drop_job(job_name => 'STATISTICS_COLUMNS_JOB');
end if;
end;
ईएएफपी के लिए यह थोड़ा अलग है; अपना खुद का अपवाद परिभाषित करें आंतरिक रूप से परिभाषित अपवाद का नामकरण द्वारा और उस त्रुटि कोड के साथ इसे तुरंत चालू करना जिसे आप पकड़ना चाहते हैं। अगर वह त्रुटि उठाई जाती है, तो कुछ न करें।
declare
job_doesnt_exist EXCEPTION;
PRAGMA EXCEPTION_INIT( job_doesnt_exist, -27475 );
begin
dbms_scheduler.drop_job(job_name => 'STATISTICS_COLUMNS_JOB');
exception when job_doesnt_exist then
null;
end;
इस दूसरी विधि के बारे में दो बातें ध्यान देने योग्य हैं।
-
मैं केवल हूं इस विशिष्ट अपवाद द्वारा उठाई गई त्रुटि को पकड़ना।
EXCEPTION WHEN OTHERS
. का उपयोग करके एक ही चीज़ प्राप्त करना संभव होगा लेकिन मैं विरुद्ध . की अत्यधिक अनुशंसा करता हूं यह कर रहा हूं।यदि आप अपवाद को संभालते हैं तो आपको पता होना चाहिए कि आप इसके साथ क्या करने जा रहे हैं। यह संभावना नहीं है कि आपके पास
OTHERS
. का उपयोग करके हर एक Oracle अपवाद को ठीक से संभालने की क्षमता है और यदि आप ऐसा करते हैं तो आपको शायद उन्हें कहीं लॉग इन करना चाहिए जहां उन्हें देखा जाएगा। Oracle के अपवादों से बचने और उन्हें संभालने के लिए दिशानिर्देश<से उद्धृत करने के लिए /ए> : -
Oracle का अपवाद प्रसार आंतरिक ब्लॉक से बाहरी ब्लॉक तक काम करता है इसलिए त्रुटि का मूल कारण पहला अपवाद होगा।