केवल विशिष्ट ओरेकल अपवादों को कैसे पकड़ें और संभालें?


20

से इस और इस मुझे लगता है, वहाँ कोई ORA-00,955 के लिए पूर्वनिर्धारित जाता है कि नाम सिस्टम अपवाद।

मैं केवल ORA-00955 त्रुटि को पकड़ने के लिए निम्नलिखित को कैसे लिख सकता हूं?

begin
      EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
exception when OTHERS then
    Null;
end;

BTW क्या सिर्फ त्रुटि-कोड प्रदान करके त्रुटियों को पकड़ने का कोई वाक्यविन्यास है?

जवाबों:


33

आपके पास दो विकल्प हैं:


सीधे संख्या से अपवाद देखें:

BEGIN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
    WHEN OTHERS THEN
      IF SQLCODE = -955 THEN
        NULL; -- suppresses ORA-00955 exception
      ELSE
         RAISE;
      END IF;
END; 

अन्य विकल्प EXCEPTION_INITउपयोगकर्ता परिभाषित अपवाद के लिए एक ज्ञात ओरेकल त्रुटि संख्या को बांधने के लिए प्रज्ञा निर्देश का उपयोग करना है;

DECLARE
   name_in_use exception; --declare a user defined exception
   pragma exception_init( name_in_use, -955 ); --bind the error code to the above 
BEGIN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
    when name_in_use then
       null; --suppress ORA-00955 exception
END; 

BTW क्या सिर्फ त्रुटि-कोड प्रदान करके त्रुटियों को पकड़ने का कोई वाक्यविन्यास है?

हां, मैंने इसे पहले उदाहरण में प्रदर्शित किया है

इस पर बदलाव के लिए आगे पढ़ने:


1
क्या मैं नहीं जा सकता जब अन्य लोग लाइनें बढ़ाते हैं?
bernd_k

@bernd_k हां आप ऐसा करते हैं, यह एक अपवाद के रूप में चला जाता है, लेकिन
सियाथजीथ भट

2
कृपया जब sqlcode955 =) न हो तो अपने WHEN OTHERS में एक वृद्धि जोड़ें
विंसेंट मालाग्राट

ओपी अभी भी अन्य त्रुटियों को उठाना चाह सकता है। आपका अपवाद ब्लॉक "जैसा है" बिल्कुल वैसा ही है जैसा कि जब कोई व्यक्ति पूरा करता है। मुझे लगता है कि ओपी कुछ अधिक सटीक और सूक्ष्म चाहते हैं।
विंसेंट मालाग्रेट

@VincentMalgrat आप सही हैं।
सत्यजित भट्ट

5

जैसा कि सत्य ने पहले ही सुझाया है, वैसा ही है, लेकिन मैं when othersपूरी तरह से संभव हो तो बचना पसंद करता हूं - एक बिना अपवाद अपवाद आमतौर पर अपवादों के लिए सही परिणाम हैं जिन्हें आप विशेष रूप से नहीं संभाल रहे हैं:

create sequence foo;
/*
sequence FOO created.
*/
declare
  name_is_already_used_955 exception;
  pragma exception_init(name_is_already_used_955,-955);
begin
  execute immediate 'create sequence foo';
exception when name_is_already_used_955 then null;
end;
/
/*
anonymous block completed
*/

यह वही है जो मैंने सथ्य से निपटाया था।
bernd_k
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.