PL / SQL - अपवाद

इस अध्याय में, हम PL / SQL में अपवादों पर चर्चा करेंगे। एक अपवाद एक कार्यक्रम के निष्पादन के दौरान एक त्रुटि स्थिति है। PL / SQL प्रोग्रामर का उपयोग करके ऐसी स्थितियों को पकड़ने के लिए समर्थन करता हैEXCEPTIONकार्यक्रम में ब्लॉक और त्रुटि की स्थिति के खिलाफ एक उचित कार्रवाई की जाती है। दो प्रकार के अपवाद हैं -

  • सिस्टम-परिभाषित अपवाद
  • उपयोगकर्ता-परिभाषित अपवाद

अपवाद हैंडलिंग के लिए सिंटैक्स

अपवाद हैंडलिंग के लिए सामान्य सिंटैक्स निम्नानुसार है। यहां आप कई अपवादों को सूचीबद्ध कर सकते हैं जितना आप संभाल सकते हैं। डिफ़ॉल्ट अपवाद का उपयोग करके नियंत्रित किया जाएगाWHEN others THEN -

DECLARE 
   <declarations section> 
BEGIN 
   <executable command(s)> 
EXCEPTION 
   <exception handling goes here > 
   WHEN exception1 THEN  
      exception1-handling-statements  
   WHEN exception2  THEN  
      exception2-handling-statements  
   WHEN exception3 THEN  
      exception3-handling-statements 
   ........ 
   WHEN others THEN 
      exception3-handling-statements 
END;

उदाहरण

आइए हम अवधारणा को समझाने के लिए एक कोड लिखें। हम पिछले अध्यायों में बनाए गए और उपयोग किए गए ग्राहक तालिका का उपयोग करेंगे -

DECLARE 
   c_id customers.id%type := 8; 
   c_name customerS.Name%type; 
   c_addr customers.address%type; 
BEGIN 
   SELECT  name, address INTO  c_name, c_addr 
   FROM customers 
   WHERE id = c_id;  
   DBMS_OUTPUT.PUT_LINE ('Name: '||  c_name); 
   DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr); 

EXCEPTION 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such customer!'); 
   WHEN others THEN 
      dbms_output.put_line('Error!'); 
END; 
/

जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

No such customer!  

PL/SQL procedure successfully completed.

उपरोक्त कार्यक्रम एक ग्राहक का नाम और पता प्रदर्शित करता है जिसकी आईडी दी गई है। चूंकि हमारे डेटाबेस में आईडी मान 8 के साथ कोई ग्राहक नहीं है, इसलिए कार्यक्रम रन-टाइम अपवाद को बढ़ाता हैNO_DATA_FOUND, जिस पर कब्जा कर लिया गया है EXCEPTION block

अपवाद उठाना

जब भी कोई आंतरिक डेटाबेस त्रुटि होती है, तो डेटाबेस सर्वर द्वारा अपवाद स्वचालित रूप से उठाए जाते हैं, लेकिन कमांडर द्वारा कमांड का उपयोग करके अपवाद स्पष्ट रूप से उठाए जा सकते हैं RAISE। निम्नलिखित एक अपवाद को बढ़ाने के लिए सरल वाक्यविन्यास है -

DECLARE 
   exception_name EXCEPTION; 
BEGIN 
   IF condition THEN 
      RAISE exception_name; 
   END IF; 
EXCEPTION 
   WHEN exception_name THEN 
   statement; 
END;

आप उपरोक्त सिंटैक्स का उपयोग Oracle मानक अपवाद या किसी भी उपयोगकर्ता-परिभाषित अपवाद को बढ़ाने में कर सकते हैं। अगले भाग में, हम आपको उपयोगकर्ता द्वारा परिभाषित अपवाद को बढ़ाने पर एक उदाहरण देंगे। आप Oracle मानक अपवादों को समान तरीके से उठा सकते हैं।

उपयोगकर्ता-परिभाषित अपवाद

पीएल / एसक्यूएल आपको अपने स्वयं के अपवादों को अपने कार्यक्रम की आवश्यकता के अनुसार परिभाषित करने की अनुमति देता है। एक उपयोगकर्ता-परिभाषित अपवाद घोषित किया जाना चाहिए और फिर RAISE स्टेटमेंट या कार्यविधि का उपयोग करके स्पष्ट रूप से उठाया जाना चाहिएDBMS_STANDARD.RAISE_APPLICATION_ERROR

अपवाद घोषित करने का सिंटैक्स है -

DECLARE 
   my-exception EXCEPTION;

उदाहरण

निम्नलिखित उदाहरण अवधारणा को दर्शाता है। यह प्रोग्राम ग्राहक आईडी के लिए पूछता है, जब उपयोगकर्ता एक अमान्य आईडी, अपवाद दर्ज करता हैinvalid_id उठाया है।

DECLARE 
   c_id customers.id%type := &cc_id; 
   c_name customerS.Name%type; 
   c_addr customers.address%type;  
   -- user defined exception 
   ex_invalid_id  EXCEPTION; 
BEGIN 
   IF c_id <= 0 THEN 
      RAISE ex_invalid_id; 
   ELSE 
      SELECT  name, address INTO  c_name, c_addr 
      FROM customers 
      WHERE id = c_id;
      DBMS_OUTPUT.PUT_LINE ('Name: '||  c_name);  
      DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr); 
   END IF; 

EXCEPTION 
   WHEN ex_invalid_id THEN 
      dbms_output.put_line('ID must be greater than zero!'); 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such customer!'); 
   WHEN others THEN 
      dbms_output.put_line('Error!');  
END; 
/

जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

Enter value for cc_id: -6 (let's enter a value -6) 
old  2: c_id customers.id%type := &cc_id; 
new  2: c_id customers.id%type := -6; 
ID must be greater than zero! 
 
PL/SQL procedure successfully completed.

पूर्व-परिभाषित अपवाद

पीएल / एसक्यूएल कई पूर्व-परिभाषित अपवाद प्रदान करता है, जो किसी प्रोग्राम द्वारा किसी डेटाबेस नियम का उल्लंघन किए जाने पर निष्पादित किए जाते हैं। उदाहरण के लिए, पूर्वनिर्धारित अपवाद NO_DATA_FOUND तब उठाया जाता है जब एक SELECT INTO कथन कोई पंक्तियाँ नहीं देता है। निम्न तालिका कुछ पूर्व-परिभाषित अपवादों को सूचीबद्ध करती है -

अपवाद Oracle त्रुटि SQLCODE विवरण
ACCESS_INTO_NULL 06530 -6530 यह तब उठाया जाता है जब एक अशक्त वस्तु को स्वचालित रूप से एक मान दिया जाता है।
CASE_NOT_FOUND 06,592 -6592 यह तब उठाया जाता है जब CASE स्टेटमेंट के WHEN क्लॉज में कोई भी विकल्प नहीं चुना जाता है, और कोई ELSE क्लॉज नहीं होता है।
COLLECTION_IS_NULL 06,531 -6531 यह तब उठाया जाता है जब कोई प्रोग्राम किसी अनइंस्टॉलिज्ड नेस्टेड टेबल या वेरिएंट के अलावा EXISTS के अलावा अन्य कलेक्शन के तरीकों को लागू करने का प्रयास करता है, या प्रोग्राम एक अनइंस्टाल्यूटेड नेस्टेड टेबल या वेरिए के तत्वों को मान असाइन करने का प्रयास करता है।
DUP_VAL_ON_INDEX 00001 -1 यह तब उठाया जाता है जब डुप्लिकेट मानों को अद्वितीय सूचकांक वाले कॉलम में संग्रहीत करने का प्रयास किया जाता है।
INVALID_CURSOR 01001 -1001 यह तब उठाया जाता है जब एक कर्सर ऑपरेशन बनाने की कोशिश की जाती है जिसे अनुमति नहीं दी जाती है, जैसे कि बिना बंद किए गए कर्सर को बंद करना।
अमान्य संख्या 01,722 -1722 यह तब उठाया जाता है जब वर्ण स्ट्रिंग का संख्या में रूपांतरण विफल हो जाता है क्योंकि स्ट्रिंग एक मान्य संख्या का प्रतिनिधित्व नहीं करती है।
LOGIN_DENIED 01017 -1017 यह तब उठाया जाता है जब कोई प्रोग्राम किसी अमान्य उपयोगकर्ता नाम या पासवर्ड के साथ डेटाबेस पर लॉग ऑन करने का प्रयास करता है।
कोई डेटा नहीं मिला 01403 +100 इसे तब चुना जाता है जब कोई SELECT INTO स्टेटमेंट कोई पंक्तियाँ नहीं देता है।
NOT_LOGGED_ON 01012 -1012 डेटाबेस से कनेक्ट किए बिना डेटाबेस कॉल जारी किए जाने पर इसे उठाया जाता है।
PROGRAM_ERROR 06,501 -6501 यह तब उठाया जाता है जब PL / SQL में आंतरिक समस्या होती है।
ROWTYPE_MISMATCH 06504 -6504 यह तब उठाया जाता है जब एक कर्सर असंगत डेटा प्रकार वाले चर में मूल्य प्राप्त करता है।
SELF_IS_NULL 30,625 -30,625 यह तब उठाया जाता है जब एक सदस्य विधि लागू की जाती है, लेकिन ऑब्जेक्ट प्रकार का उदाहरण प्रारंभिक नहीं था।
STORAGE_ERROR 06,500 -6500 यह तब उठाया जाता है जब पीएल / एसक्यूएल मेमोरी से बाहर हो गया या मेमोरी दूषित हो गई थी।
TOO_MANY_ROWS 01,422 -1422 यह तब उठाया जाता है जब एक SELECT INTO स्टेटमेंट एक से अधिक पंक्ति में लौटता है।
VALUE_ERROR 06,502 -6502 यह तब उठाया जाता है जब एक अंकगणित, रूपांतरण, ट्रंकेशन या सिज़ेकोस्ट्रैटिन त्रुटि होती है।
ZERO_DIVIDE 01476 1476 यह तब उठाया जाता है जब किसी संख्या को शून्य से विभाजित करने का प्रयास किया जाता है।