अपवाद प्रबंधन Oracle PL/SQL (उदाहरण)

⚡ स्मार्ट सारांश

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

  • ⚙️ रन-टाइम त्रुटियाँ: एक अपवाद तब उत्पन्न होता है जब PL/SQL इंजन को ऐसा निर्देश मिलता है जिसे वह निष्पादित नहीं कर सकता, जैसे कि किसी संख्या को शून्य से विभाजित करना।
  • 🧱 ब्लॉक संरचना: अपवादों को EXCEPTION सेक्शन में WHEN क्लॉज़ का उपयोग करके संभाला जाता है, जिसमें WHEN OTHERS हमेशा सबसे अंत में रखा जाता है।
  • 📚 पूर्वनिर्धारित अपवाद: Oracle STANDARD पैकेज में NO_DATA_FOUND और ZERO_DIVIDE जैसी सामान्य त्रुटियों के नाम दिए गए हैं, जिन्हें सीधे पकड़ा जा सकता है।
  • उपयोगकर्ता-परिभाषित अपवाद: प्रोग्रामर अपने स्वयं के EXCEPTION वेरिएबल घोषित करते हैं और RAISE कीवर्ड के साथ उन्हें स्पष्ट रूप से बढ़ाते हैं।
  • प्रचार: एक अनहैंडल्ड एक्सेप्शन एनक्लोजिंग ब्लॉक को पास हो जाता है, और RAISE इसे पैरेंट प्रोग्राम को पुनः सिग्नल करता है।
  • 🤖 एआई सहायता: एआई कोडिंग टूल समीक्षा के दौरान एक्सेप्शन ब्लॉक तैयार करते हैं और अनहैंडल्ड एरर पाथ को चिह्नित करते हैं।

अपवाद प्रबंधन Oracle PL / SQL

PL/SQL में अपवाद प्रबंधन क्या है?

जब 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 का उपयोग अकेले ही संलग्न ब्लॉक में अपवाद को पुनः उत्पन्न करने के लिए किया गया है:

केवल RAISE का उपयोग करके अपवाद को पैरेंट ब्लॉक तक पहुंचाना

CREATE [ PROCEDURE | FUNCTION ]
 AS
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN
             <Handler>
RAISE;
END;

वाक्यविन्यास स्पष्टीकरण:

  • ऊपर दिए गए वाक्यविन्यास में, RAISE कीवर्ड का उपयोग अपवाद-हैंडलिंग ब्लॉक के अंदर किया गया है।
  • जब भी प्रोग्राम को 'exception_name' नामक अपवाद का सामना करना पड़ता है, तो अपवाद को संभाला जाता है और प्रोग्राम सामान्य रूप से पूरा हो जाता है।
  • हैंडलर में RAISE कीवर्ड उसी अपवाद को पैरेंट प्रोग्राम तक पहुंचाता है।

नोट: पैरेंट ब्लॉक में अपवाद उत्पन्न करते समय, उत्पन्न किया जा रहा अपवाद पैरेंट ब्लॉक में भी दिखाई देना चाहिए; अन्यथा Oracle एक त्रुटि फेंकता है.

आप RAISE कीवर्ड के बाद अपवाद का नाम लिखकर उस विशेष उपयोगकर्ता-परिभाषित या पूर्वनिर्धारित अपवाद को उत्पन्न कर सकते हैं। इस प्रारूप का उपयोग निष्पादन और अपवाद-हैंडलिंग दोनों भागों में किया जा सकता है।

नीचे दिए गए स्क्रीनशॉट में 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 को घोषित करता है, इसे एक नेस्टेड ब्लॉक के अंदर उत्पन्न करता है, और इसे मुख्य ब्लॉक तक पहुंचाता है:

नेस्टेड ब्लॉक में उपयोगकर्ता-परिभाषित अपवाद घोषित करने और उत्पन्न करने का PL/SQL उदाहरण

निम्नलिखित स्क्रीनशॉट में उसी उदाहरण को जारी रखा गया है, जहां मुख्य ब्लॉक अंततः प्रसारित अपवाद को कैप्चर करता है:

आउटपुट में पहले नेस्टेड ब्लॉक में और फिर मुख्य ब्लॉक में पकड़ी गई त्रुटि दिखाई गई है।

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 के बीच होना चाहिए।

अक्सर पूछे जाने वाले प्रश्न

PRAGMA EXCEPTION_INIT उपयोगकर्ता द्वारा घोषित अपवाद नाम को एक विशिष्ट अपवाद से संबद्ध करता है। Oracle त्रुटि संख्या। बाइंडिंग के बाद, आप WHEN OTHERS का उपयोग करने और SQLCODE की जाँच करने के बजाय WHEN क्लॉज़ में नाम से उस ORA त्रुटि को पकड़ सकते हैं।

SQLCODE वर्तमान अपवाद का संख्यात्मक त्रुटि कोड लौटाता है, जबकि SQLERRM उसका पाठ संदेश लौटाता है। दोनों को अपवाद हैंडलर के अंदर, आमतौर पर WHEN OTHERS ब्लॉक में, त्रुटि का लॉग बनाने या प्रदर्शित करने के लिए कॉल किया जाता है।

WHEN OTHERS का उपयोग करने से बचें जो हर त्रुटि को चुपचाप दबा देता है। SQLCODE और SQLERRM को लॉग किए बिना या RAISE के साथ पुनः उत्पन्न किए बिना, यह बग्स को छिपा देता है। इसका उपयोग केवल लॉग करने, त्रुटि को ठीक करने और फिर अपवाद को आगे बढ़ाने के लिए करें।

RAISE_APPLICATION_ERROR -20000 और -20999 के बीच एक त्रुटि संख्या और 2048 बाइट्स तक का एक संदेश स्वीकार करता है। यह निष्पादन को रोक देता है और कॉलिंग एप्लिकेशन को एक कस्टम त्रुटि लौटाता है, जिससे उपयोगकर्ता-परिभाषित स्थिति एक मूल त्रुटि की तरह दिखती है। Oracle त्रुटि।

एक ही ब्लॉक में नहीं — जैसे ही नियंत्रण EXCEPTION सेक्शन में जाता है, वह ब्लॉक समाप्त हो जाता है। आगे बढ़ने के लिए, जोखिम भरे कथन को एक आंतरिक BEGIN…EXCEPTION…END ब्लॉक में लपेटें; त्रुटि को संभालने के बाद, बाहरी ब्लॉक निष्पादन जारी रखता है।

त्रुटि कोड में किसी भी रन-टाइम या कंपाइल समस्या को कहते हैं। अपवाद PL/SQL का रन-टाइम तंत्र है जो रन-टाइम त्रुटि को दर्शाता है और नियंत्रण को EXCEPTION अनुभाग में स्थानांतरित करता है ताकि प्रोग्राम अचानक समाप्त होने के बजाय प्रतिक्रिया दे सके।

जी हां। एआई सहायक और मशीन लर्निंग कोड समीक्षक एक्सेप्शन ब्लॉक तैयार करते हैं, यह सुझाव देते हैं कि किन पूर्वनिर्धारित अपवादों को पकड़ना है, और उन कोड पाथ को चिह्नित करते हैं जिनमें हैंडलर मौजूद नहीं हैं। डेवलपर को डिप्लॉय करने से पहले लॉजिक और त्रुटि संदेशों की पुष्टि अवश्य कर लेनी चाहिए।

गिटहब कोपिलॉट यह ऐप उद्देश्य का वर्णन करने वाली एक संक्षिप्त टिप्पणी से WHEN क्लॉज़, RAISE_APPLICATION_ERROR कॉल और पूरे EXCEPTION ब्लॉक को स्वतः पूर्ण कर देता है। इससे रूटीन हैंडलर कोडिंग में तेज़ी आती है, हालांकि उत्पन्न त्रुटि कोड और संदेशों की सटीकता की समीक्षा आवश्यक है।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: