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 | यह तब उठाया जाता है जब किसी संख्या को शून्य से विभाजित करने का प्रयास किया जाता है। |