यदि आप एक प्रोग्रामर हैं, तो आप अपवाद हैंडलिंग की अवधारणा से परिचित हो सकते हैं जो किसी भी प्रोग्रामिंग भाषा का एक अभिन्न अंग है। चूंकि त्रुटियां अपरिहार्य हैं और हममें से सबसे चतुर भी कोड लिखते समय गलतियां कर सकते हैं, हमें उनसे निपटने के तरीके से परिचित होना चाहिए। इस लेख में, हम विशेष रूप से PL/SQL में एक्सेप्शन हैंडलिंग के बारे में सीखेंगे।
नीचे इस लेख में शामिल विषय दिए गए हैं:
- अपवाद क्या है?
- अपवाद हैंडलिंग का सिंटैक्स
- अपवादों के प्रकार
- सिस्टम परिभाषित
- नामांकित सिस्टम अपवाद
- अज्ञात सिस्टम अपवाद
- उपयोगकर्ता द्वारा परिभाषित
- उपयोगकर्ता द्वारा परिभाषित कार्यों को घोषित करने के चरण
- उपयोगकर्ता द्वारा परिभाषित कार्यों के उदाहरण
- सिस्टम परिभाषित
अपवाद क्या है?
कोई भी असामान्य स्थिति या घटना जो रन टाइम पर या सरल शब्दों में हमारे प्रोग्राम निर्देशों के सामान्य प्रवाह को बाधित करती है, एक त्रुटि है।
PL/SQL में अपवाद हैंडलिंग का सिंटैक्स
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;
यहां, हम जितने अपवादों को संभालना चाहते हैं, उन्हें सूचीबद्ध कर सकते हैं। डिफ़ॉल्ट अपवाद को 'जब अन्य तब' का उपयोग करके नियंत्रित किया जाएगा
पीएल/एसक्यूएल में अपवाद हैंडलिंग का उदाहरण
नीचे दिया गया कार्यक्रम उस छात्र का नाम और पता प्रदर्शित करता है जिसकी आईडी दी गई है। चूंकि हमारे डेटाबेस में आईडी मान 8 वाला कोई छात्र नहीं है, इसलिए प्रोग्राम रन-टाइम अपवाद NO_DATA_FOUND उठाता है, जिसे EXCEPTION ब्लॉक में कैप्चर किया जाता है।
DECLARE s_id studentS.id%type := 8; s_name studentS.Name%type; s_loc studentS.loc%type; BEGIN SELECT name, loation INTO s_name, s_loc FROM students WHERE id = s_id; DBMS_OUTPUT.PUT_LINE ('Name: '|| s_name); DBMS_OUTPUT.PUT_LINE ('Location: ' || s_loc); EXCEPTION WHEN no_data_found THEN dbms_output.put_line('No such student!'); WHEN others THEN dbms_output.put_line('Oops, Error!'); END;
आउटपुट
No such student! PL/SQL procedure successfully completed.
यहां, हम जितने अपवादों को संभालना चाहते हैं, उन्हें सूचीबद्ध कर सकते हैं। डिफ़ॉल्ट अपवाद को 'जब अन्य तब . का उपयोग करके नियंत्रित किया जाएगा ’
PL/SQL में अपवादों के प्रकार
- सिस्टम परिभाषित
- उपयोगकर्ता की अवहेलना
PL/SQL में एक्सेप्शन हैंडलिंग पर इस लेख में अगला, आइए इन दोनों प्रकारों के बारे में विस्तार से चर्चा करें।
सिस्टम परिभाषित
Oracle सर्वर द्वारा परोक्ष रूप से परिभाषित और अनुरक्षित, इन अपवादों को मुख्य रूप से Oracle मानक पैकेज में परिभाषित किया गया है। जब भी प्रोग्राम के अंदर कोई अपवाद होता है, तो Oracle सर्वर मेल खाता है और oracle मानक पैकेज में उपलब्ध अपवादों के उपलब्ध सेट से उपयुक्त अपवाद की पहचान करता है। मूल रूप से, इन अपवादों को पीएल/एसक्यूएल में पूर्वनिर्धारित किया जाता है जो उठाया जाता है जब विशेष डेटाबेस नियम का उल्लंघन किया जाता है ।
सिस्टम-परिभाषित अपवाद आगे दो श्रेणियों में विभाजित हैं:
- नामांकित सिस्टम अपवाद
- अज्ञात सिस्टम अपवाद
नामांकित सिस्टम अपवाद
नामित PL/SQL अपवाद PL/SQL के मानक पैकेज में नामित हैं , इसलिए डेवलपर को अपने कोड में PL/SQL अपवादों को परिभाषित करने की आवश्यकता नहीं है। पीएल/एसक्यूएल कई पूर्व-परिभाषित नामित अपवाद प्रदान करता है, जिन्हें किसी प्रोग्राम द्वारा किसी डेटाबेस नियम का उल्लंघन होने पर निष्पादित किया जाता है। निम्न तालिका कुछ महत्वपूर्ण पूर्व-निर्धारित अपवादों को सूचीबद्ध करती है -
अपवाद | Oracle त्रुटि | SQLCODE | विवरण |
ACCESS_INTO_NULL | 06530 | -6530 | इसे तब उठाया जाता है जब एक अशक्त वस्तु को स्वचालित रूप से एक मान दिया जाता है। |
CASE_NOT_FOUND | 06592 | -6592 | इसे तब उठाया जाता है जब किसी केस स्टेटमेंट के WHEN क्लॉज में से कोई भी विकल्प नहीं चुना जाता है, और कोई ELSE क्लॉज नहीं होता है। |
COLLECTION_IS_NULL | 06531 | -6531 | इसे तब उठाया जाता है जब कोई प्रोग्राम किसी गैर-आरंभिक नेस्टेड तालिका या सरणी के लिए EXISTS के अलावा अन्य संग्रह विधियों को लागू करने का प्रयास करता है, या प्रोग्राम एक गैर-आरंभिक नेस्टेड तालिका या सरणी के तत्वों को मान निर्दिष्ट करने का प्रयास करता है। |
DUP_VAL_ON_INDEX | 00001 | -1 | इसे तब उठाया जाता है जब एक अद्वितीय अनुक्रमणिका वाले कॉलम में डुप्लिकेट मानों को संग्रहीत करने का प्रयास किया जाता है। |
INVALID_CURSOR | 01001 | -1001 | इसे तब उठाया जाता है जब एक कर्सर ऑपरेशन करने का प्रयास किया जाता है जिसकी अनुमति नहीं है, जैसे कि एक बंद कर्सर को बंद करना। |
INVALID_NUMBER | 01722 | -1722 | इसे तब उठाया जाता है जब किसी वर्ण स्ट्रिंग का किसी संख्या में रूपांतरण विफल हो जाता है क्योंकि स्ट्रिंग एक मान्य संख्या का प्रतिनिधित्व नहीं करती है। |
LOGIN_DENIED | 01017 | -1017 | इसे तब उठाया जाता है जब कोई प्रोग्राम अमान्य उपयोगकर्ता नाम या पासवर्ड के साथ डेटाबेस में लॉग ऑन करने का प्रयास करता है। |
NO_DATA_FOUND | 01403 | +100 | इसे तब उठाया जाता है जब SELECT INTO स्टेटमेंट में कोई पंक्तियाँ नहीं होती हैं। |
NOT_LOGGED_ON | 01012 | -1012 | इसे तब उठाया जाता है जब डेटाबेस से जुड़े बिना डेटाबेस कॉल जारी किया जाता है। |
PROGRAM_ERROR | 06501 | -6501 | इसे तब उठाया जाता है जब PL/SQL में कोई आंतरिक समस्या होती है। |
ROWTYPE_MISMATCH | 06504 | -6504 | इसे तब उठाया जाता है जब कोई कर्सर असंगत डेटा प्रकार वाले वेरिएबल में मान प्राप्त करता है। |
SELF_IS_NULL | 30625 | -30625 | सदस्य विधि लागू होने पर इसे उठाया जाता है, लेकिन ऑब्जेक्ट प्रकार का उदाहरण प्रारंभ नहीं किया गया था। |
STORAGE_ERROR | 06500 | -6500 | इसे तब उठाया जाता है जब PL/SQL की मेमोरी खत्म हो जाती है या मेमोरी खराब हो जाती है। |
TOO_MANY_ROWS | 01422 | -1422 | इसे तब उठाया जाता है जब SELECT INTO स्टेटमेंट एक से अधिक पंक्तियों को लौटाता है। |
VALUE_ERROR | 06502 | -6502 | अंकगणित, रूपांतरण, काट-छाँट, या आकार बाधा त्रुटि होने पर इसे बढ़ाया जाता है। |
ZERO_DIVIDE | 01476 | 1476 | जब किसी संख्या को शून्य से विभाजित करने का प्रयास किया जाता है तो इसे बढ़ाया जाता है। |
उदाहरण
CREATE OR REPLACE PROCEDURE add_new_student (student _id_in IN NUMBER, student _name_in IN VARCHAR2) IS BEGIN INSERT INTO student (student _id, student _name ) VALUES ( student _id_in, student _name_in ); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN raise_application_error (-20001,'Duplicate student _id'); WHEN OTHERS THEN raise_application_error (-20002,'An error occurred.'); END;
पीएल/एसक्यूएल में अपवाद प्रबंधन पर इस लेख में आगे बढ़ते हुए, आइए समझते हैं कि अनाम सिस्टम अपवाद क्या हैं।
अज्ञात सिस्टम अपवाद
सिस्टम अपवाद जिसके लिए Oracle का कोई नाम नहीं है, अनाम सिस्टम अपवाद के रूप में जाना जाता है। ये अपवाद अक्सर नहीं होते हैं और एक कोड और एक संबद्ध संदेश के साथ लिखे जाते हैं।
अज्ञात सिस्टम अपवादों को संभालने के मूल रूप से दो तरीके हैं:
1. जब अन्य अपवाद हैंडलर का उपयोग करना
2. अपवाद कोड को किसी नाम से जोड़ना और इसे नामित अपवाद के रूप में उपयोग करना।
अज्ञात सिस्टम अपवादों के लिए कुछ चरणों का पालन किया जाता है:
- उन्हें परोक्ष रूप से उठाएं।
- यदि उन्हें 'जब अन्य' में नहीं संभाला जाता है, तो उन्हें स्पष्ट रूप से संभाला जाना चाहिए।
- अपवाद को स्पष्ट रूप से संभालने के लिए, उन्हें Pragma EXCEPTION_INIT का उपयोग करके घोषित किया जा सकता है और अपवाद अनुभाग में उपयोगकर्ता द्वारा परिभाषित अपवाद नाम को संदर्भित करके नियंत्रित किया जा सकता है।
प्राग्मा EXCEPTION_INIT का उपयोग करके अनाम अपवादों को संभालने का एक उदाहरण लेख में बाद में दिया गया है। पीएल/एसक्यूएल में अपवाद प्रबंधन पर इस लेख में आगे बढ़ते हुए, आइए हम उपयोगकर्ता-परिभाषित अपवादों को समझते हैं।
उपयोगकर्ता-परिभाषित
अन्य सभी प्रोग्रामिंग भाषाओं की तरह, Oracle भी आपको अपने स्वयं के अपवादों को लागू करने वाले विज्ञापन की घोषणा करने की अनुमति देता है। सिस्टम परिभाषित अपवादों के विपरीत, ये अपवाद PL/SQL ब्लॉक में स्पष्ट रूप से उठाए गए हैं।
Oracle डेटाबेस में उपयोगकर्ता-परिभाषित अपवाद घोषित करने के चरण
हम Oracle डेटाबेस में उपयोगकर्ता द्वारा परिभाषित अपवादों को निम्नलिखित 3 तरीकों से परिभाषित कर सकते हैं:
- अपवाद प्रकार के वेरिएबल का उपयोग करना
यहां, हम अपने कोड में EXCEPTION डेटाटाइप का एक वेरिएबल घोषित करके एक उपयोगकर्ता-परिभाषित अपवाद घोषित कर सकते हैं और RAISE स्टेटमेंट का उपयोग करके इसे अपने प्रोग्राम में स्पष्ट रूप से बढ़ा सकते हैं।
- PRAGMA EXCEPTION_INIT फ़ंक्शन का उपयोग करना
हम एक गैर-पूर्वनिर्धारित त्रुटि संख्या को EXCEPTION डेटाटाइप के चर के साथ परिभाषित कर सकते हैं
- RAISE_APPLICATION_ERROR विधि का उपयोग करना
इस पद्धति का उपयोग करके, हम अपने स्वयं के अनुकूलित त्रुटि संख्या और संदेश के साथ एक उपयोगकर्ता-परिभाषित अपवाद घोषित कर सकते हैं।
अब तक आपको इस बात का अंदाजा हो गया होगा कि हम PL/SQL में यूजर-डिफ़ाइंड एक्सेप्शन को कैसे बढ़ा सकते हैं। हम PL/SQL में एक्सेप्शन हैंडलिंग पर इस लेख में उदाहरणों के साथ उपर्युक्त प्रत्येक तरीके के बारे में जानेंगे।
इस लेख में अगला, आइए हम उपयोगकर्ता-परिभाषित अपवाद हैंडलिंग के प्रदर्शनों के साथ आगे बढ़ें।
उपयोगकर्ता-परिभाषित अपवादों का प्रदर्शन
PL/SQL में एक्सेप्शन हैंडलिंग पर इस लेख में आगे बढ़ते हुए, आइए समझते हैं कि EXCEPTION प्रकार के वेरिएबल का उपयोग कैसे करें।
अपवाद प्रकार के चर का उपयोग करना
उपयोगकर्ता द्वारा परिभाषित अपवाद घोषित करने की प्रक्रिया को तीन भागों में बांटा गया है और ये 3 भाग हैं:
- एक चर अपवाद डेटाटाइप घोषित करें
- अपवाद उठाएं
- अपवाद को संभालें
आइए उपरोक्त चरणों को विस्तार से प्रदर्शित करने के लिए एक कोड लिखें।
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION
उपरोक्त घोषणा ब्लॉक में, हमारे पास चार चर हैं, जिनमें से पहले तीन सामान्य संख्या डेटाटाइप चर हैं और चौथा जो ex_DivZero है वह विशेष अपवाद डेटाटाइप चर है। चौथा हमारा उपयोगकर्ता-परिभाषित अपवाद है।
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION
इस अनाम ब्लॉक का उपरोक्त निष्पादन भाग, केवल तभी क्रिया में आएगा जब भाजक 0 है। यदि भाजक शून्य है जैसा कि हमारे मामले में है, तो त्रुटि उठाई जाएगी और कार्यक्रम का नियंत्रण अगले सभी चरणों को छोड़ देगा और मिलान अपवाद हैंडलर की तलाश करेगा। मामले में जहां यह किसी अन्य को पाता है, वह तदनुसार कार्रवाई करेगा, अन्यथा यह या तो प्रोग्राम को समाप्त कर देगा या हमें एक अनहेल्ड सिस्टम परिभाषित त्रुटि के साथ संकेत देगा।
EXCEPTION WHEN ex_DivZero THEN DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);
यह अपवाद हैंडलर। जैसे ही उपयोगकर्ता भाजक को 0 के रूप में दर्ज करता है, उपरोक्त संदेश स्ट्रिंग को संकेत दिया जाएगा।
अंतिम कोड:
DECLARE var_dividend NUMBER :=10; var_divisor NUMBER :=0 var_result NUMBER; ex-DivZero EXCEPTION BEGIN IF var_divisor =0 THEN RAISE ex-DivZero; END IF; Var_result := var_dividend/var_divisor; DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result); BEGIN IF var_divisor =0 THEN RAISE ex-DivZero; END IF; Var_result := var_dividend/var_divisor; DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result); END;
PL/SQL में अपवाद प्रबंधन पर इस लेख में आगे बढ़ते हुए, आइए समझते हैं कि PRAGMA_EXCEPTION_INIT पद्धति का उपयोग कैसे करें।
PRAGMA EXCEPTION_INIT फ़ंक्शन का उपयोग करना
PRAGMA EXCEPTION_INIT फ़ंक्शन में, एक अपवाद नाम Oracle त्रुटि संख्या के साथ संबद्ध होता है। इस नाम का उपयोग त्रुटि के लिए अपवाद हैंडलर को डिजाइन करने में किया जा सकता है। कई उपयोगकर्ता परिभाषित त्रुटियों वाली बड़ी परियोजनाओं के लिए, PRAGMA EXCEPTION_INIT सबसे उपयोगी और उपयुक्त तरीका है।
वाक्यविन्यास:
PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);
उदाहरण
DECLARE deadlock_detected EXCEPTION; PRAGMA EXCEPTION_INIT(deadlock_detected, -60); BEGIN NULL; -- Some operation that causes an ORA-00060 error EXCEPTION WHEN deadlock_detected THEN NULL; -- handle the error END;
PRAGMA EXCEPTION_INIT कंपाइलर को एक अपवाद नाम को Oracle त्रुटि संख्या के साथ जोड़ने के लिए कहता है जैसा कि पहले उल्लेख किया गया है। यह आपको नाम से किसी भी आंतरिक अपवाद को संदर्भित करने और इसके लिए एक विशिष्ट हैंडलर लिखने देता है। जब आपको कोई त्रुटि स्टैक, या त्रुटि संदेशों का क्रम दिखाई देता है, तो सबसे ऊपर वह होता है जिसे ट्रैप और हैंडल किया जा सकता है।
PL/SQL में एक्सेप्शन हैंडलिंग पर इस लेख में आगे बढ़ते हुए, आइए समझते हैं कि RAISE_APPLICATION_ERROR विधि का उपयोग कैसे करें।
RAISE_APPLICATION_ERROR पद्धति का उपयोग करना
यह एक प्रक्रिया है जो oracle सॉफ़्टवेयर के साथ अंतर्निहित है। इस प्रक्रिया का उपयोग करके हम एक त्रुटि संख्या को एक कस्टम त्रुटि संदेश के साथ जोड़ सकते हैं। त्रुटि संख्या और कस्टम त्रुटि संदेश दोनों को मिलाकर, एक त्रुटि स्ट्रिंग की रचना की जा सकती है जो उन डिफ़ॉल्ट त्रुटि स्ट्रिंग्स के समान दिखती है जो किसी त्रुटि का सामना करने पर ऑरैकल द्वारा प्रदर्शित की जाती हैं। RAISE_APPLICATION_ERROR प्रक्रिया DBMS_STANDARD पैकेज के अंदर पाई जाती है
वाक्यविन्यास
raise_application_error (error_number, message [, {TRUE | FALSE}]);
उदाहरण
/* A trigger trg_emp_detail_chk is created.*/ CREATE OR REPLACE TRIGGER trg_emp_detail_chk /* The trigger timing is declared as BEFORE UPDATE on the EMPLOYEES table.*/ Before UPDATE ON employees DECLARE permission_denied EXCEPTION; BEGIN /*Start of the IF condition checking whether the day of the system time is either Saturday or Sunday or not.*/ IF trim(TO_CHAR(sysdate,'Day')) IN ('Saturday', 'Sunday') THEN raise_application_error(-20000, 'You are not authorized to do any modification in the weekends!!'); /* The procedure raise_application_error is called with the first parameter value as -20000 and the second parameter with a default text stating that the user is not authorized to do any modification in the weekends. */ END IF; END;
इसी के साथ हम "PL/SQL में एक्सेप्शन हैंडलिंग" पर इस लेख को समाप्त करते हैं। मुझे आशा है कि इस विषय को अच्छी तरह से समझा गया है और आपकी मदद की है। अपने स्वयं के कोड लिखने का प्रयास करें और इस लेख में बताए गए तरीकों को शामिल करें।
यदि आप इस तकनीक पर पेशेवरों से प्रशिक्षण प्राप्त करना चाहते हैं, तो आप edureka से संरचित प्रशिक्षण का विकल्प चुन सकते हैं! दुनिया भर में फैले 250,000 से अधिक संतुष्ट शिक्षार्थियों के नेटवर्क के साथ एक विश्वसनीय ऑनलाइन शिक्षण कंपनी, एडुरेका द्वारा इस MySQL DBA प्रमाणन प्रशिक्षण की जाँच करें। यह कोर्स आपको डेटा को प्रबंधित करने और MySQL डेटाबेस को प्रबंधित करने के लिए मूल अवधारणाओं और उन्नत टूल और तकनीकों पर प्रशिक्षित करता है। इसमें MySQL कार्यक्षेत्र, MySQL सर्वर, डेटा मॉडलिंग, MySQL कनेक्टर, डेटाबेस डिज़ाइन, MySQL कमांड लाइन, MySQL फ़ंक्शंस आदि जैसी अवधारणाओं पर व्यावहारिक शिक्षण शामिल है। प्रशिक्षण के अंत में आप अपना स्वयं का MySQL डेटाबेस बनाने और प्रबंधित करने में सक्षम होंगे। डेटा।
हमारे लिए एक प्रश्न है? कृपया इस "पीएल/एसक्यूएल में अपवाद हैंडलिंग" लेख के टिप्पणी अनुभाग में इसका उल्लेख करें और हम जल्द से जल्द आपसे संपर्क करेंगे।