केवल मौजूद होने पर डीबीएमएस_SCHEDULER.DROP_JOB

मेरे पास एक एसक्यूएल स्क्रिप्ट है जो मुझे डंप आयात करने के बाद चलाना चाहिए। स्क्रिप्ट करता है अन्य चीजों के अलावा, यह निम्नलिखित करता है:

BEGIN 
--remove program          
SYS.DBMS_SCHEDULER.DROP_PROGRAM(program_name=>'STATISTICS_COLUMNS_PROG',FORCE=>TRUE);
--remove job
SYS.DBMS_SCHEDULER.DROP_JOB (job_name => 'STATISTICS_COLUMNS_JOB');
END; 

सोमवार को मूल स्कीमा में नौकरी पहले ही गिरा दी गई थी, डंप नौकरी के बिना आता है और लिपि विफल हो जाती है:

ERROR at line 1:
ORA-27475: "DMP_6633.STATISTICS_SET_COLUMNS_JOB" must be a job 
ORA-06512: at "SYS.DBMS_ISCHED", line 213 
ORA-06512: at "SYS.DBMS_SCHEDULER", line 657 
ORA-06512: at line 5 

अगर नौकरी मौजूद नहीं है, तो मैं इस विफलता से कैसे बच सकता हूं लेकिन फिर भी इसे छोड़ने में सक्षम हो सकता है?

0

1 उत्तर

अपवाद हैंडलिंग पर आप दो मुख्य पैटर्न लागू कर सकते हैं; "लीप से पहले देखो" (एलबीवाईएल) और "अनुमति से क्षमा मांगना आसान है" (ईएएफपी)। एलबीवाईएल यह देखने के लिए जांच करेगा कि क्या इसे छोड़ने से पहले नौकरी मौजूद है या नहीं। ईएएफपी में नौकरी छोड़ने और फिर उस विशिष्ट त्रुटि को कैप्चर करने और अनदेखा करने का प्रयास करने में शामिल होगा, यदि ऐसा होता है।

यदि आप एलबीवाईएल लागू करना चाहते हैं तो आप सिस्टम दृश्य से पूछ सकते हैं < कोड> 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;

इस दूसरी विधि के बारे में दो चीजों को ध्यान देने योग्य है।

  1. I am only catching the error raised by this specific exception. It would be possible to achieve the same thing using EXCEPTION WHEN OTHERS but I would highly recommend against doing this.

    If you handle an exception you should know exactly what you're going to do with it. It's unlikely that you have the ability to handle every single Oracle exception properly using OTHERS and if you do so you should probably be logging them somewhere where they'll be noticed. To quote from Oracle's Guidelines for Avoiding and Handling Exceptions:

    Whenever possible, write exception handlers for named exceptions instead of using OTHERS exception handlers.

  2. Oracle's exception propagation works from internal block to external block so the original cause for the error will be the first exception.

0
जोड़ा
धन्यवाद! यह एक रविवार, अधिक समय है ... और मैं पहले से ही @Ian से पहले कुछ लिखा होगा।
जोड़ा लेखक Ben, स्रोत
यद्यपि यह उत्तर काफी पुराना है, मैं बस "छलांग लगाने से पहले देखो" के बारे में एक नोट जोड़ना चाहता हूं। आपकी वास्तविक स्थिति के आधार पर आप यह ध्यान में रख सकते हैं कि जिस चीज को आपने अभी अस्तित्व के लिए चेक किया है, वह आपके सत्र को हटाए जाने से ठीक पहले किसी अन्य सत्र द्वारा हटा दिया गया हो सकता है।
जोड़ा लेखक D. Mika, स्रोत
काश मैं इस जवाब को दो बार वोट दे सकता हूं!
जोड़ा लेखक Ian Carpenter, स्रोत
यह एक अच्छा जवाब है कि एक पेशेवर उत्तर कैसा दिखता है! उत्कृष्ट प्रतिक्रिया के लिए धन्यवाद!
जोड़ा लेखक SaschaM78, स्रोत