अपवाद प्रबंधन Oracle PL/SQL (उदाहरण)
PL/SQL में अपवाद प्रबंधन क्या है?
अपवाद तब होता है जब PL/SQL इंजन को कोई निर्देश मिलता है जिसे वह रन-टाइम पर होने वाली त्रुटि के कारण निष्पादित नहीं कर सकता। संकलन के समय इन त्रुटियों को कैप्चर नहीं किया जाएगा और इसलिए इन्हें केवल रन-टाइम पर ही हैंडल करने की आवश्यकता है।
उदाहरण के लिए, यदि PL/SQL इंजन को किसी संख्या को '0' से विभाजित करने का निर्देश प्राप्त होता है, तो PL/SQL इंजन इसे अपवाद के रूप में फेंक देगा। अपवाद केवल PL/SQL इंजन द्वारा रन-टाइम पर उठाया जाता है।
अपवाद प्रोग्राम को आगे चलने से रोकेंगे, इसलिए ऐसी स्थिति से बचने के लिए, उन्हें अलग से कैप्चर और हैंडल करना होगा। इस प्रक्रिया को अपवाद-हैंडलिंग कहा जाता है, जिसमें प्रोग्रामर रन टाइम पर होने वाले अपवाद को हैंडल करता है।
अपवाद-हैंडलिंग सिंटैक्स
अपवादों को ब्लॉक स्तर पर हैंडल किया जाता है, यानी अगर किसी ब्लॉक में एक बार कोई अपवाद होता है तो नियंत्रण उस ब्लॉक के निष्पादन भाग से बाहर आ जाएगा। फिर अपवाद को उस ब्लॉक के अपवाद हैंडलिंग भाग में हैंडल किया जाएगा। अपवाद को हैंडल करने के बाद, नियंत्रण को उस ब्लॉक के निष्पादन भाग में वापस भेजना संभव नहीं है।
नीचे दिया गया सिंटैक्स बताता है कि अपवाद को कैसे पकड़ा जाए और कैसे संभाला जाए।
BEGIN <execution block> . . EXCEPTION WHEN <exceptionl_name> THEN <Exception handling code for the “exception 1 _name’' > WHEN OTHERS THEN <Default exception handling code for all exceptions > END;
वाक्यविन्यास स्पष्टीकरण:
- उपरोक्त सिंटैक्स में, अपवाद-हैंडलिंग ब्लॉक में अपवाद को संभालने के लिए WHEN स्थिति की श्रृंखला शामिल है।
- प्रत्येक WHEN स्थिति के बाद अपवाद का नाम आता है, जिसे रन टाइम पर उठाए जाने की अपेक्षा होती है।
- जब रनटाइम पर कोई अपवाद उठाया जाता है, तो PL/SQL इंजन अपवाद हैंडलिंग भाग में उस विशेष अपवाद को देखेगा। यह पहले 'WHEN' क्लॉज से शुरू होगा और क्रमिक रूप से खोज करेगा।
- यदि उसे उठाए गए अपवाद के लिए अपवाद हैंडलिंग मिल गई है, तो वह उस विशेष हैंडलिंग कोड भाग को निष्पादित करेगा।
- यदि उठाए गए अपवाद के लिए कोई भी 'WHEN' खंड मौजूद नहीं है, तो PL/SQL इंजन 'WHEN OTHERS' भाग (यदि मौजूद है) को निष्पादित करेगा। यह सभी अपवादों के लिए सामान्य है।
- अपवाद निष्पादित करने के बाद, नियंत्रण का कुछ भाग वर्तमान ब्लॉक से बाहर चला जाएगा।
- रन-टाइम पर किसी ब्लॉक के लिए केवल एक अपवाद भाग निष्पादित किया जा सकता है। इसे निष्पादित करने के बाद, नियंत्रक शेष अपवाद हैंडलिंग भाग को छोड़ देगा और वर्तमान ब्लॉक से बाहर चला जाएगा।
नोट: WHEN OTHERS को हमेशा अनुक्रम के अंतिम स्थान पर होना चाहिए। WHEN OTHERS के बाद मौजूद अपवाद हैंडलिंग भाग कभी भी निष्पादित नहीं होगा क्योंकि WHEN OTHERS को निष्पादित करने के बाद नियंत्रण ब्लॉक से बाहर निकल जाएगा।
अपवाद के प्रकार
इसमें दो प्रकार के अपवाद हैं पीएल/एसक्यूएल.
- पूर्वनिर्धारित अपवाद
- उपयोगकर्ता-परिभाषित अपवाद
पूर्वनिर्धारित अपवाद
Oracle कुछ सामान्य अपवाद पूर्वनिर्धारित हैं। इन अपवादों का एक अद्वितीय अपवाद नाम और त्रुटि संख्या है। ये अपवाद पहले से ही 'STANDARD' पैकेज में परिभाषित हैं Oracleकोड में, हम इन पूर्वनिर्धारित अपवाद नामों को सीधे संभालने के लिए उपयोग कर सकते हैं।
नीचे कुछ पूर्वनिर्धारित अपवाद दिए गए हैं
अपवाद | एरर कोड | अपवाद कारण |
---|---|---|
ACCESS_INTO_NULL | ORA-06530 | अप्रारंभीकृत ऑब्जेक्ट की विशेषताओं को मान निर्दिष्ट करें |
मामला नहीं मिला | ORA-06592 | CASE कथन में कोई भी 'WHEN' खंड संतुष्ट नहीं है और कोई 'ELSE' खंड निर्दिष्ट नहीं है |
संकलन_शून्य_है | ORA-06531 | संग्रह विधियों का उपयोग करना (EXISTS को छोड़कर) या अप्रारंभीकृत संग्रह पर संग्रह विशेषताओं तक पहुँचना |
कर्सर_पहले_खुला | ORA-06511 | खोलने का प्रयास कर रहा हूँ कर्सर जो पहले से ही खुला है |
DUP_VAL_ON_INDEX | ORA-00001 | डेटाबेस कॉलम में डुप्लिकेट मान संग्रहीत करना जो अद्वितीय इंडेक्स द्वारा बाध्य है |
INVALID_कर्सर | ORA-01001 | अवैध कर्सर संचालन जैसे बंद कर्सर को बंद करना |
INVALID_NUMBER | ORA-01722 | अमान्य संख्या वर्ण के कारण वर्ण को संख्या में रूपांतरित करना विफल हुआ |
डाटा प्राप्त नहीं हुआ | ORA-01403 | जब 'SELECT' कथन जिसमें INTO क्लॉज शामिल है, कोई पंक्ति नहीं लाता है। |
पंक्ति_मिस्मैच | ORA-06504 | जब कर्सर चर डेटा प्रकार वास्तविक कर्सर रिटर्न प्रकार के साथ असंगत हो |
सदस्यता_से_अधिक_गणना | ORA-06533 | संग्रह को उस सूचकांक संख्या द्वारा संदर्भित करना जो संग्रह आकार से बड़ी है |
सदस्यता_सीमा_से_बाहर | ORA-06532 | किसी सूचकांक संख्या द्वारा संग्रह को संदर्भित करना जो वैध सीमा से बाहर है (उदाहरण: -1) |
बहुत सारी पंक्तियाँ | ORA-01422 | जब INTO क्लॉज वाला 'SELECT' कथन एक से अधिक पंक्तियाँ लौटाता है |
मान_त्रुटि | ORA-06502 | अंकगणितीय या आकार प्रतिबंध त्रुटि (उदाहरण: किसी चर को ऐसा मान निर्दिष्ट करना जो चर के आकार से बड़ा हो) |
शून्य_विभाजन | ORA-01476 | किसी संख्या को '0' से विभाजित करना |
उपयोगकर्ता-परिभाषित अपवाद
In Oracleउपरोक्त पूर्वनिर्धारित अपवादों के अलावा, प्रोग्रामर अपना स्वयं का अपवाद बना सकता है और उन्हें संभाल सकता है। उन्हें घोषणा भाग में उपप्रोग्राम स्तर पर बनाया जा सकता है। ये अपवाद केवल उस उपप्रोग्राम में दिखाई देते हैं। पैकेज विनिर्देश में परिभाषित अपवाद सार्वजनिक अपवाद है, और यह जहाँ भी पैकेज सुलभ है, वहाँ दिखाई देता है।
सिंटेक्स: उपकार्यक्रम स्तर पर
DECLARE <exception_name> EXCEPTION; BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> END;
- उपरोक्त सिंटैक्स में, चर 'exception_name' को 'EXCEPTION' प्रकार के रूप में परिभाषित किया गया है।
- इसका उपयोग पूर्वनिर्धारित अपवाद के समान ही किया जा सकता है।
सिंटेक्स:पैकेज विनिर्देश स्तर पर
CREATE PACKAGE <package_name> IS <exception_name> EXCEPTION; . . END <package_name>;
- उपरोक्त सिंटैक्स में, चर 'exception_name' को पैकेज विनिर्देश में 'EXCEPTION' प्रकार के रूप में परिभाषित किया गया है .
- इसका उपयोग डेटाबेस में जहां भी पैकेज 'package_name' को कॉल किया जा सकता है, किया जा सकता है।
PL/SQL अपवाद उठाएँ
जब भी कोई त्रुटि होती है, तो सभी पूर्वनिर्धारित अपवाद अंतर्निहित रूप से उठाए जाते हैं। लेकिन उपयोगकर्ता-परिभाषित अपवादों को स्पष्ट रूप से उठाए जाने की आवश्यकता होती है। इसे 'RAISE' कीवर्ड का उपयोग करके प्राप्त किया जा सकता है। इसका उपयोग नीचे बताए गए किसी भी तरीके से किया जा सकता है।
यदि प्रोग्राम में 'RAISE' का अलग से उपयोग किया जाता है, तो यह पहले से उठाए गए अपवाद को पैरेंट ब्लॉक में प्रसारित कर देगा। केवल अपवाद ब्लॉक में ही इसका उपयोग किया जा सकता है जैसा कि नीचे दिखाया गया है।
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> RAISE; END;
वाक्यविन्यास स्पष्टीकरण:
- उपरोक्त सिंटैक्स में, RAISE कीवर्ड का उपयोग अपवाद हैंडलिंग ब्लॉक में किया गया है।
- जब भी प्रोग्राम अपवाद “exception_name” का सामना करता है, तो अपवाद को संभाला जाता है और सामान्य रूप से पूरा किया जाएगा
- लेकिन अपवाद प्रबंधन भाग में कीवर्ड 'RAISE' इस विशेष अपवाद को मूल प्रोग्राम तक प्रसारित कर देगा।
नोट: पैरेंट ब्लॉक में अपवाद उठाते समय उठाया जा रहा अपवाद पैरेंट ब्लॉक में भी दिखाई देना चाहिए, अन्यथा ओरेकल एक त्रुटि फेंक देगा।
- हम उस विशेष उपयोगकर्ता-परिभाषित/पूर्वनिर्धारित अपवाद को उठाने के लिए अपवाद नाम के बाद 'RAISE' कीवर्ड का उपयोग कर सकते हैं। अपवाद को उठाने के लिए इसका उपयोग निष्पादन भाग और अपवाद हैंडलिंग भाग दोनों में किया जा सकता है।
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
वाक्यविन्यास स्पष्टीकरण:
- उपरोक्त सिंटैक्स में, निष्पादन भाग में RAISE कीवर्ड का उपयोग किया जाता है, उसके बाद अपवाद “exception_name” का उपयोग किया जाता है।
- इससे निष्पादन के समय यह विशेष अपवाद उत्पन्न होगा, और इसे आगे भी संभालना या उठाना आवश्यक होगा।
उदाहरण 1इस उदाहरण में, हम देखेंगे
- अपवाद कैसे घोषित करें
- घोषित अपवाद को कैसे उठाया जाए और
- इसे मुख्य ब्लॉक तक कैसे प्रसारित करें
DECLARE Sample_exception EXCEPTION; PROCEDURE nested_block IS BEGIN Dbms_output.put_line(‘Inside nested block’); Dbms_output.put_line(‘Raising sample_exception from nested block’); RAISE sample_exception; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in nested block. Raising to main block’); RAISE, END; BEGIN Dbms_output.put_line(‘Inside main block’); Dbms_output.put_line(‘Calling nested block’); Nested_block; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block'); END: /
कोड स्पष्टीकरण:
- कोड लाइन 2: चर 'sample_exception' को EXCEPTION प्रकार के रूप में घोषित करना।
- कोड लाइन 3: प्रक्रिया nested_block घोषित किया जा रहा है.
- कोड लाइन 6: “इनसाइड नेस्टेड ब्लॉक” कथन को प्रिंट किया जा रहा है।
- कोड पंक्ति 7: “नेस्टेड ब्लॉक से सैंपल_एक्सेप्शन उठाना” कथन प्रिंट किया जा रहा है।
- कोड पंक्ति 8: 'RAISE sample_exception' का उपयोग करके अपवाद उठाना।
- कोड पंक्ति 10: नेस्टेड ब्लॉक में अपवाद sample_exception के लिए अपवाद हैंडलर.
- कोड पंक्ति 11: 'अपवाद नेस्टेड ब्लॉक में कैप्चर किया गया। मुख्य ब्लॉक में उठाया जा रहा है' कथन को प्रिंट किया जा रहा है।
- कोड पंक्ति 12: अपवाद को मुख्य ब्लॉक तक उठाना (मुख्य ब्लॉक तक प्रसारित करना)।
- कोड पंक्ति 15: “मुख्य ब्लॉक के अंदर” कथन मुद्रित करना।
- कोड पंक्ति 16: “नेस्टेड ब्लॉक कॉलिंग” कथन प्रिंट किया जा रहा है।
- कोड पंक्ति 17: नेस्टेड_ब्लॉक प्रक्रिया को कॉल करना.
- कोड पंक्ति 18: अपवाद
- कोड पंक्ति 19: मुख्य ब्लॉक में sample_exception के लिए अपवाद हैंडलर.
- कोड पंक्ति 20: “मुख्य ब्लॉक में अपवाद कैप्चर किया गया” कथन प्रिंट करना।
अपवाद में ध्यान देने योग्य महत्वपूर्ण बिंदु
- फ़ंक्शन में, अपवाद को हमेशा या तो मान लौटाना चाहिए या अपवाद को और आगे बढ़ाना चाहिए। Oracle रन-टाइम पर 'फ़ंक्शन बिना मान के लौटाया गया' त्रुटि फेंक देगा।
- लेनदेन नियंत्रण कथन अपवाद हैंडलिंग ब्लॉक पर दिए जा सकते हैं।
- SQLERRM और SQLCODE इन-बिल्ट फ़ंक्शन हैं जो अपवाद संदेश और कोड देंगे।
- यदि किसी अपवाद को नहीं संभाला जाता है तो डिफ़ॉल्ट रूप से उस सत्र में सभी सक्रिय लेनदेन वापस ले लिए जाएंगे।
- RAISE_APPLICATION_ERROR (- , ) का उपयोग उपयोगकर्ता कोड और संदेश के साथ त्रुटि को बढ़ाने के लिए RAISE के बजाय किया जा सकता है। त्रुटि कोड 20000 से अधिक होना चाहिए और '-' उपसर्ग के साथ होना चाहिए।
सारांश
इस अध्याय के बाद, आप पीएल के निम्नलिखित पहलुओं पर काम करने में सक्षम होंगे एसक्यूएल अपवाद
- अपवादों को संभालना
- अपवाद परिभाषित करें
- अपवाद उठाएँ
- अपवाद प्रसार