अपवाद प्रबंधन Oracle PL/SQL (उदाहरण)
⚡ स्मार्ट सारांश
अपवाद प्रबंधन Oracle PL/SQL रन-टाइम त्रुटियों को कैप्चर करता है जो किसी ब्लॉक को निष्पादन से रोकती हैं, जिससे इंजन नियंत्रण को एक EXCEPTION सेक्शन में स्थानांतरित कर सकता है जहां पूर्वनिर्धारित, उपयोगकर्ता-परिभाषित और OTHERS हैंडलर सुरक्षित रूप से त्रुटियों का जवाब देते हैं, उत्पन्न करते हैं या प्रसारित करते हैं।

PL/SQL में अपवाद प्रबंधन क्या है?
जब PL/SQL इंजन को रन-टाइम त्रुटि के कारण कोई निर्देश निष्पादित करने में असमर्थता का सामना करना पड़ता है, तो एक अपवाद उत्पन्न होता है। ये त्रुटियाँ संकलन समय पर पता नहीं चलतीं, इसलिए इन्हें केवल रन-टाइम पर ही हल किया जाना चाहिए।
उदाहरण के लिए, यदि PL/SQL इंजन को किसी संख्या को शून्य से भाग देने का निर्देश प्राप्त होता है, तो यह त्रुटि को एक अपवाद के रूप में उत्पन्न करता है। यह अपवाद केवल रन-टाइम पर 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 के निष्पादित होने के बाद नियंत्रण ब्लॉक से बाहर निकल जाता है।
अपवाद के प्रकार
इसमें दो प्रकार के अपवाद हैं PL / SQL.
- पूर्वनिर्धारित अपवाद
- उपयोगकर्ता-परिभाषित अपवाद
पूर्वनिर्धारित अपवाद
Oracle इसमें कुछ सामान्य अपवादों को पूर्वनिर्धारित किया गया है। प्रत्येक पूर्वनिर्धारित अपवाद का एक अद्वितीय नाम और त्रुटि संख्या होती है, और उन सभी को STANDARD पैकेज में घोषित किया गया है। Oracleकोड में, आप संबंधित त्रुटियों को संभालने के लिए इन पूर्वनिर्धारित अपवाद नामों का सीधे उपयोग कर सकते हैं। इनमें से कई सीधे सामान्य त्रुटियों से मेल खाते हैं। एसक्यूएल आपको हर दिन ऐसी त्रुटियों का सामना करना पड़ता है।
नीचे कुछ पूर्वनिर्धारित अपवाद दिए गए हैं:
| अपवाद | त्रुटि Code | अपवाद कारण |
|---|---|---|
| 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 | INTO क्लॉज़ वाला SELECT स्टेटमेंट कोई पंक्ति नहीं लाता है। |
| पंक्ति_मिस्मैच | ORA-06504 | कर्सर वेरिएबल का डेटा प्रकार वास्तविक कर्सर रिटर्न प्रकार के साथ असंगत है। |
| सदस्यता_से_अधिक_गणना | ORA-06533 | संग्रह के आकार से बड़ी अनुक्रमणिका संख्या द्वारा संग्रह का संदर्भ देना |
| सदस्यता_सीमा_से_बाहर | ORA-06532 | किसी संग्रह को कानूनी सीमा से बाहर के सूचकांक संख्या (उदाहरण के लिए, -1) द्वारा संदर्भित करना। |
| बहुत सारी पंक्तियाँ | ORA-01422 | INTO क्लॉज़ वाला SELECT स्टेटमेंट एक से अधिक पंक्तियाँ लौटाता है। |
| मान_त्रुटि | ORA-06502 | अंकगणितीय या आकार-बाधा त्रुटि (उदाहरण के लिए, चर के आकार से बड़ा मान निर्दिष्ट करना) |
| शून्य_विभाजन | ORA-01476 | किसी संख्या को शून्य से भाग देना |
उपयोगकर्ता-परिभाषित अपवाद
ऊपर बताए गए पूर्वनिर्धारित अपवादों के अलावा, एक प्रोग्रामर कस्टम अपवाद बना सकता है और उन्हें हैंडल कर सकता है। ये अपवाद सबप्रोग्राम स्तर पर घोषणा भाग में बनाए जाते हैं और केवल उसी सबप्रोग्राम के भीतर दिखाई देते हैं। पैकेज विनिर्देश में परिभाषित अपवाद एक सार्वजनिक अपवाद होता है और यह उन सभी स्थानों पर दिखाई देता है जहां पैकेज को एक्सेस किया जा सकता है।
वाक्यविन्यास: उपप्रोग्राम स्तर पर
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 का उपयोग नीचे दिखाए गए तरीकों से किया जा सकता है।
यदि किसी हैंडलर के भीतर RAISE का उपयोग अकेले किया जाता है, तो यह पहले से उत्पन्न अपवाद को पैरेंट ब्लॉक तक पहुंचा देता है। इसका उपयोग केवल अपवाद ब्लॉक के भीतर ही किया जा सकता है, जैसा कि नीचे दिखाया गया है।
नीचे दिया गया स्क्रीनशॉट दिखाता है कि RAISE का उपयोग अकेले ही संलग्न ब्लॉक में अपवाद को पुनः उत्पन्न करने के लिए किया गया है:
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> RAISE; END;
वाक्यविन्यास स्पष्टीकरण:
- ऊपर दिए गए वाक्यविन्यास में, RAISE कीवर्ड का उपयोग अपवाद-हैंडलिंग ब्लॉक के अंदर किया गया है।
- जब भी प्रोग्राम को 'exception_name' नामक अपवाद का सामना करना पड़ता है, तो अपवाद को संभाला जाता है और प्रोग्राम सामान्य रूप से पूरा हो जाता है।
- हैंडलर में RAISE कीवर्ड उसी अपवाद को पैरेंट प्रोग्राम तक पहुंचाता है।
नोट: पैरेंट ब्लॉक में अपवाद उत्पन्न करते समय, उत्पन्न किया जा रहा अपवाद पैरेंट ब्लॉक में भी दिखाई देना चाहिए; अन्यथा Oracle एक त्रुटि फेंकता है.
आप RAISE कीवर्ड के बाद अपवाद का नाम लिखकर उस विशेष उपयोगकर्ता-परिभाषित या पूर्वनिर्धारित अपवाद को उत्पन्न कर सकते हैं। इस प्रारूप का उपयोग निष्पादन और अपवाद-हैंडलिंग दोनों भागों में किया जा सकता है।
नीचे दिए गए स्क्रीनशॉट में RAISE के बाद एक अपवाद का नाम दिखाया गया है, जिसका उपयोग किसी विशिष्ट अपवाद को उत्पन्न करने के लिए किया जाता है:
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
वाक्यविन्यास स्पष्टीकरण:
- ऊपर दिए गए वाक्यविन्यास में, निष्पादन भाग में RAISE कीवर्ड का उपयोग किया गया है, जिसके बाद अपवाद 'exception_name' आता है।
- इससे रनटाइम पर वह विशेष अपवाद उत्पन्न होता है, और फिर उसे संभालने या आगे उत्पन्न करने की आवश्यकता होती है।
उदाहरण 1: इस उदाहरण में हम देखेंगे:
- अपवाद की घोषणा कैसे करें
- घोषित अपवाद को कैसे उत्पन्न करें
- इसे मुख्य ब्लॉक तक कैसे प्रसारित करें
नीचे दिया गया स्क्रीनशॉट उस संपूर्ण ब्लॉक को दर्शाता है जो sample_exception को घोषित करता है, इसे एक नेस्टेड ब्लॉक के अंदर उत्पन्न करता है, और इसे मुख्य ब्लॉक तक पहुंचाता है:
निम्नलिखित स्क्रीनशॉट में उसी उदाहरण को जारी रखा गया है, जहां मुख्य ब्लॉक अंततः प्रसारित अपवाद को कैप्चर करता है:
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; /
Code स्पष्टीकरण:
- Code पंक्ति 2: 'sample_exception' नामक चर को EXCEPTION प्रकार के रूप में घोषित करना।
- Code पंक्ति 3: प्रक्रिया nested_block की घोषणा करना।
- Code पंक्ति 6: “नेस्टेड ब्लॉक के अंदर” कथन को प्रिंट करना।
- Code पंक्ति 7: “नेस्टेड ब्लॉक से sample_exception उत्पन्न करना” कथन को प्रिंट करना।
- Code पंक्ति 8: 'RAISE sample_exception' का उपयोग करके अपवाद उठाना।
- Code पंक्ति 10: नेस्टेड ब्लॉक में मौजूद एक्सेप्शन sample_exception के लिए एक्सेप्शन हैंडलर।
- Code पंक्ति 11: “नेस्टेड ब्लॉक में अपवाद पकड़ा गया। मुख्य ब्लॉक में उठाया जा रहा है” कथन को प्रिंट करना।
- Code पंक्ति 12: अपवाद को मुख्य ब्लॉक में उठाना (इसे प्रसारित करना)।
- Code पंक्ति 15: "मुख्य ब्लॉक के अंदर" कथन को प्रिंट करना।
- Code पंक्ति 16: “नेस्टेड ब्लॉक कॉलिंग” कथन प्रिंट किया जा रहा है।
- Code पंक्ति 17: nested_block प्रक्रिया को कॉल किया जा रहा है।
- Code पंक्ति 19: मुख्य ब्लॉक में sample_exception के लिए अपवाद हैंडलर.
- Code पंक्ति 20: "मुख्य ब्लॉक में अपवाद पकड़ा गया" कथन को प्रिंट करना।
अपवाद में ध्यान देने योग्य महत्वपूर्ण बिंदु
- किसी फ़ंक्शन में, अपवाद को हमेशा या तो कोई मान लौटाना चाहिए या अपवाद को आगे बढ़ाना चाहिए; अन्यथा Oracle रनटाइम पर 'फ़ंक्शन बिना मान के लौटा' त्रुटि उत्पन्न करता है।
- लेनदेन नियंत्रण विवरण इसे अपवाद-हैंडलिंग ब्लॉक के अंदर जारी किया जा सकता है।
- SQLERRM और SQLCODE अंतर्निर्मित फ़ंक्शन हैं जो क्रमशः अपवाद संदेश और अपवाद कोड लौटाते हैं।
- यदि किसी अपवाद को संभाला नहीं जाता है, तो डिफ़ॉल्ट रूप से उस सत्र में सभी सक्रिय लेनदेन रोलबैक कर दिए जाते हैं।
- RAISE_APPLICATION_ERROR (- , त्रुटि उत्पन्न करने के लिए RAISE के स्थान पर ) का उपयोग किया जा सकता है, जिसमें एक कस्टम कोड और संदेश शामिल होगा। त्रुटि कोड -20000 और -20999 के बीच होना चाहिए।





