PL / SQL में अपवाद हैंडलिंग क्या है?
अपवाद तब होता है जब पीएल / एसक्यूएल इंजन एक निर्देश का सामना करता है जिसे वह रन-टाइम पर होने वाली त्रुटि के कारण निष्पादित नहीं कर सकता है। संकलन के समय इन त्रुटियों को कैप्चर नहीं किया जाएगा और इसलिए इन्हें केवल रन-टाइम पर संभालने की आवश्यकता है।
उदाहरण के लिए, यदि PL / SQL इंजन को किसी संख्या को '0' से विभाजित करने का निर्देश मिलता है, तो PL / SQL इंजन इसे अपवाद के रूप में फेंक देगा। अपवाद केवल पीएल / एसक्यूएल इंजन द्वारा रन-टाइम पर उठाया जाता है।
अपवाद कार्यक्रम को आगे निष्पादित करने से रोकेंगे, इसलिए ऐसी स्थिति से बचने के लिए, उन्हें अलग से पकड़ने और संभालने की आवश्यकता है। इस प्रक्रिया को अपवाद-हैंडलिंग कहा जाता है, जिसमें प्रोग्रामर उस अपवाद को संभालता है जो रन टाइम पर हो सकता है।
इस ट्यूटोरियल में, आप निम्नलिखित विषयों को जानेंगे-
- अपवाद-हैंडलिंग सिंटैक्स
- अपवाद के प्रकार
- पूर्वनिर्धारित अपवाद
- उपयोगकर्ता-परिभाषित अपवाद
- पीएल / एसक्यूएल उठाएँ अपवाद
- अपवाद में ध्यान देने योग्य महत्वपूर्ण बिंदु
अपवाद-हैंडलिंग सिंटैक्स
अपवादों को ब्लॉक, स्तर पर नियंत्रित किया जाता है, अर्थात, यदि एक बार किसी भी ब्लॉक में कोई अपवाद होता है, तो नियंत्रण उस ब्लॉक के निष्पादन भाग से बाहर आ जाएगा। इसके बाद अपवाद को उस ब्लॉक के अपवाद हैंडलिंग भाग में संभाला जाएगा। अपवाद को संभालने के बाद, उस ब्लॉक के निष्पादन अनुभाग पर नियंत्रण वापस भेजना संभव नहीं है।
नीचे दिए गए वाक्यविन्यास बताते हैं कि अपवाद को कैसे पकड़ना और संभालना है।
BEGIN… EXCEPTIONWHEN THEN WHEN OTHERSTHEN END;
सिंटैक्स स्पष्टीकरण:
- उपरोक्त सिंटैक्स में, अपवाद-हैंडलिंग ब्लॉक में अपवाद को संभालने के लिए WHEN स्थिति की श्रृंखला होती है।
- प्रत्येक WHEN शर्त का पालन अपवाद नाम से किया जाता है जिसे रन टाइम में उठाए जाने की उम्मीद की जाती है।
- जब कोई अपवाद रनटाइम पर उठाया जाता है, तो पीएल / एसक्यूएल इंजन उस विशेष अपवाद के लिए अपवाद हैंडलिंग भाग में दिखेगा। यह पहले 'WHEN' क्लॉज से शुरू होगा और क्रमिक रूप से यह खोज करेगा।
- यदि यह अपवाद के अपवाद को देखता है जो उठाया गया है, तो यह उस विशेष हैंडलिंग कोड भाग को निष्पादित करेगा।
- यदि none WHEN ’क्लॉज में से कोई भी उस अपवाद के लिए मौजूद नहीं है जो उठाया गया है, तो PL / SQL इंजन ERS WHEN OTHERS’ भाग (यदि मौजूद है) को निष्पादित करेगा। यह सभी अपवादों के लिए सामान्य है।
- अपवाद को निष्पादित करने के बाद, भाग नियंत्रण वर्तमान ब्लॉक से बाहर चला जाएगा।
- केवल एक अपवाद भाग को रन-टाइम पर ब्लॉक के लिए निष्पादित किया जा सकता है। इसे निष्पादित करने के बाद, नियंत्रक शेष अपवाद हैंडलिंग भाग को छोड़ देगा और वर्तमान ब्लॉक से बाहर चला जाएगा।
नोट: जब दूसरों को हमेशा अनुक्रम के अंतिम स्थान पर होना चाहिए। WHEN OTHERS के बाद मौजूद अपवाद हैंडलिंग हिस्सा कभी निष्पादित नहीं होगा क्योंकि WHENTHERS को निष्पादित करने के बाद नियंत्रण ब्लॉक से बाहर निकल जाएगा।
अपवाद के प्रकार
Pl / SQL में दो तरह के Exception हैं।
- पूर्वनिर्धारित अपवाद
- उपयोगकर्ता-परिभाषित अपवाद
पूर्वनिर्धारित अपवाद
ओरेकल ने कुछ सामान्य अपवाद को पूर्वनिर्धारित किया है। इन अपवादों में एक अद्वितीय अपवाद नाम और त्रुटि संख्या है। ये अपवाद पहले से ही Oracle में 'STANDARD' पैकेज में परिभाषित हैं। कोड में, हम सीधे उन्हें संभालने के लिए इन पूर्वनिर्धारित अपवाद नाम का उपयोग कर सकते हैं।
नीचे कुछ पूर्वनिर्धारित अपवाद दिए गए हैं
अपवाद | एरर कोड | अपवाद कारण |
ACCESS_INTO_NULL | ORA-06530 | असमान वस्तुओं की विशेषताओं के लिए एक मूल्य निर्दिष्ट करें |
CASE_NOT_FOUND | ORA-06592 | CASE स्टेटमेंट में 'WHEN' क्लॉज में से कोई भी संतुष्ट नहीं है और कोई 'ELSE' क्लॉज निर्दिष्ट नहीं है |
COLLECTION_IS_NULL | ORA-06531 | संग्रह विधियों (EXISTS को छोड़कर) का उपयोग करना या एक संग्रहित संग्रह विशेषताओं तक पहुँचना |
CURSOR_ALREADY_OPEN | ORA-06511 | एक कर्सर खोलने की कोशिश कर रहा है जो पहले से ही खुला है |
DUP_VAL_ON_INDEX | ORA-00001 | एक डेटाबेस स्तंभ में एक डुप्लिकेट मान को संग्रहीत करना जो अद्वितीय सूचकांक द्वारा विवश है |
INVALID_CURSOR | ORA-01001 | एक अनपेक्षित कर्सर को बंद करने की तरह अवैध कर्सर संचालन |
अमान्य संख्या | ORA-01722 | अमान्य संख्या वर्ण के कारण वर्ण में संख्या में रूपांतरण विफल रहा |
कोई डेटा नहीं मिला | ORA-01403 | जब 'चयन' कथन जिसमें INTO क्लॉज होता है, कोई पंक्तियाँ नहीं लाता है। |
ROW_MISMATCH | ORA-06504 | जब कर्सर चर डेटा प्रकार वास्तविक कर्सर रिटर्न प्रकार के साथ असंगत है |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | एक इंडेक्स संख्या द्वारा संग्रह का जिक्र करना जो संग्रह आकार से बड़ा है |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | एक इंडेक्स संख्या द्वारा संग्रह का जिक्र करना जो कानूनी सीमा से बाहर है (उदाहरण: -1) |
TOO_MANY_ROWS | ORA-01422 | जब INTO क्लॉज़ वाला 'Select' स्टेटमेंट एक से अधिक पंक्ति देता है |
VALUE_ERROR | ORA-06502 | अंकगणित या आकार बाधा त्रुटि (जैसे: एक चर का मान निर्दिष्ट करना जो चर आकार से बड़ा है) |
ZERO_DIVIDE | ORA-01476 | संख्या को '0' से विभाजित करना |
उपयोगकर्ता-परिभाषित अपवाद
ओरेकल में, उपरोक्त पूर्वनिर्धारित अपवादों के अलावा, प्रोग्रामर अपना स्वयं का अपवाद बना सकता है और उन्हें संभाल सकता है। उन्हें घोषणा भाग में एक उपप्रोग्राम स्तर पर बनाया जा सकता है। ये अपवाद केवल उस सबप्रोग्राम में दिखाई देते हैं। पैकेज विनिर्देश में जो अपवाद परिभाषित किया गया है वह सार्वजनिक अपवाद है, और यह जहाँ पैकेज सुलभ है वहां दिखाई देता है। <
सिंटैक्स: उपप्रोग्राम स्तर पर
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- उपरोक्त सिंटैक्स में, चर 'अपवाद_नाम' को 'अपवाद' प्रकार के रूप में परिभाषित किया गया है।
- इसे पूर्वनिर्धारित अपवाद के समान उपयोग किया जा सकता है।
सिंटेक्स: पैकेज विनिर्देश स्तर पर
CREATE PACKAGEIS EXCEPTION;… END ;
- उपरोक्त सिंटैक्स में, चर 'अपवाद_name' को <पैकेज '/> के पैकेज विनिर्देश में' अपवाद 'प्रकार के रूप में परिभाषित किया गया है।
- यह डेटाबेस में इस्तेमाल किया जा सकता है जहाँ भी पैकेज 'पैकेज_नाम' कहा जा सकता है।
पीएल / एसक्यूएल उठाएँ अपवाद
जब भी त्रुटि होती है सभी पूर्वनिर्धारित अपवादों को स्पष्ट रूप से उठाया जाता है। लेकिन उपयोगकर्ता द्वारा परिभाषित अपवादों को स्पष्ट रूप से उठाया जाना चाहिए। यह 'RAISE' कीवर्ड का उपयोग करके प्राप्त किया जा सकता है। इसका उपयोग नीचे दिए गए किसी भी तरीके से किया जा सकता है।
यदि कार्यक्रम में अलग से 'RAISE' का उपयोग किया जाता है, तो यह मूल ब्लॉक के लिए पहले से उठाए गए अपवाद का प्रचार करेगा। केवल अपवाद ब्लॉक में ही नीचे दिखाया गया है।
CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN THEN RAISE;END;
सिंटैक्स स्पष्टीकरण:
- उपरोक्त सिंटैक्स में, RAISE शब्द का उपयोग अपवाद हैंडलिंग ब्लॉक में किया जाता है।
- जब भी कार्यक्रम "अपवाद_नाम" अपवाद का सामना करता है, अपवाद को नियंत्रित किया जाता है और सामान्य रूप से पूरा किया जाएगा
- लेकिन अपवाद हैंडलिंग भाग में कीवर्ड 'RAISE' मूल कार्यक्रम के लिए इस विशेष अपवाद का प्रचार करेगा।
नोट: मूल ब्लॉक को अपवाद बनाते समय जो अपवाद हो रहा है वह मूल ब्लॉक पर भी दिखाई देना चाहिए, अन्यथा ओरेकल एक त्रुटि फेंक देगा।
- हम उस विशेष उपयोगकर्ता-परिभाषित / पूर्वनिर्धारित अपवाद को बढ़ाने के लिए अपवाद नाम के बाद कीवर्ड 'RAISE' का उपयोग कर सकते हैं। इसका उपयोग निष्पादन भाग में और अपवाद को संभालने के लिए अपवाद हैंडलिंग भाग दोनों में किया जा सकता है।
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN THEN END;
सिंटैक्स स्पष्टीकरण:
- उपरोक्त सिंटैक्स में, RAIS का उपयोग निष्पादन भाग में किया जाता है, इसके बाद अपवाद "अपवाद_नाम" होता है।
- यह निष्पादन के समय इस विशेष अपवाद को बढ़ाएगा, और इसे संभाल या आगे बढ़ाने की आवश्यकता है।
उदाहरण 1 : इस उदाहरण में, हम देखने जा रहे हैं
- अपवाद कैसे घोषित करें
- घोषित अपवाद को कैसे उठाया जाए और
- इसे मुख्य ब्लॉक में कैसे प्रचारित किया जाए
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block');END:/
कोड स्पष्टीकरण:
- कोड लाइन 2 : चर 'sample_exception' को घोषणा प्रकार के रूप में घोषित करना।
- कोड लाइन 3 : प्रक्रिया nested_block की घोषणा।
- कोड लाइन 6 : "इनसाइड नेस्टेड ब्लॉक" स्टेटमेंट को प्रिंट करना।
- कोड लाइन 7: कथन को प्रिंट करना "नेस्टेड ब्लॉक से नमूना_सेप्शन को उठाना।"
- कोड पंक्ति 8: 'RAISE sample_exception' का उपयोग करके अपवाद उठाना।
- कोड लाइन 10: नेस्ट ब्लॉक में अपवाद sample_exception के लिए अपवाद हैंडलर।
- कोड लाइन 11: कथन को मुद्रित करना 'अपवाद नेस्टेड ब्लॉक में कब्जा कर लिया। मुख्य ब्लॉक तक उठाना '।
- कोड लाइन 12: मुख्य ब्लॉक (मुख्य ब्लॉक का प्रचार) के अपवाद को उठाना।
- कोड लाइन 15: "मुख्य ब्लॉक के अंदर" कथन को प्रिंट करना।
- कोड लाइन 16: स्टेटमेंट "कॉलिंग नेस्टेड ब्लॉक" को प्रिंट करना।
- कोड लाइन 17: नेस्टेडब्लॉक प्रक्रिया को कॉल करना।
- कोड लाइन 19: मुख्य ब्लॉक में sample_exception के लिए अपवाद हैंडलर।
- कोड लाइन 20: स्टेटमेंट को प्रिंट करना "अपवाद मुख्य ब्लॉक में कैप्चर किया गया।"
अपवाद में ध्यान देने योग्य महत्वपूर्ण बिंदु
- फ़ंक्शन में, एक अपवाद हमेशा या तो मान लौटाता है या अपवाद को और बढ़ाता है। अन्यथा ओरेकल रन-टाइम में 'फंक्शन बिना मान के लौटे' त्रुटि को फेंक देगा।
- अपवाद नियंत्रण ब्लॉक में लेन-देन नियंत्रण विवरण दिए जा सकते हैं।
- SQLERRM और SQLCODE इन-बिल्ट फ़ंक्शंस हैं जो अपवाद संदेश और कोड देंगे।
- यदि एक अपवाद को संभाला नहीं जाता है, तो डिफ़ॉल्ट रूप से उस सत्र में सभी सक्रिय लेनदेन वापस चालू हो जाएंगे।
- उपयोगकर्ता कोड और संदेश के साथ त्रुटि को बढ़ाने के लिए RAISE_APPLICATION_ERROR (-
, ) का उपयोग RAISE के बजाय किया जा सकता है। त्रुटि कोड 20000 से अधिक होना चाहिए और '-' के साथ उपसर्ग होना चाहिए।
सारांश
इस अध्याय के बाद। आपको Pl SQL अपवादों के निम्नलिखित पहलुओं के लिए काम करने में सक्षम होना चाहिए
- अपवादों को संभालना
- एक अपवाद को परिभाषित करें
- अपवाद उठाएं
- अपवाद प्रचार