Database
 sql >> डेटाबेस >  >> RDS >> Database

पीएल/एसक्यूएल में अपवादों को संभालने का तरीका जानें

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

नीचे इस लेख में शामिल विषय दिए गए हैं:

  • अपवाद क्या है?
  • अपवाद हैंडलिंग का सिंटैक्स
  • अपवादों के प्रकार
    • सिस्टम परिभाषित
      • नामांकित सिस्टम अपवाद
      • अज्ञात सिस्टम अपवाद
    • उपयोगकर्ता द्वारा परिभाषित
      • उपयोगकर्ता द्वारा परिभाषित कार्यों को घोषित करने के चरण
      • उपयोगकर्ता द्वारा परिभाषित कार्यों के उदाहरण

अपवाद क्या है?

कोई भी असामान्य स्थिति या घटना जो रन टाइम पर या सरल शब्दों में हमारे प्रोग्राम निर्देशों के सामान्य प्रवाह को बाधित करती है, एक त्रुटि है।

PL/SQL में अपवाद हैंडलिंग का सिंटैक्स

DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2&nbsp; 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 डेटाबेस बनाने और प्रबंधित करने में सक्षम होंगे। डेटा।

हमारे लिए एक प्रश्न है? कृपया इस "पीएल/एसक्यूएल में अपवाद हैंडलिंग" लेख के टिप्पणी अनुभाग में इसका उल्लेख करें और हम जल्द से जल्द आपसे संपर्क करेंगे।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटा विश्लेषण गाइड:एक्सेल का उपयोग करके उत्कृष्टता प्राप्त करने का समय आ गया है!

  2. OGG-01224 पता पहले से प्रयोग में है

  3. पूर्ण जटिलताएं - भाग 2

  4. स्कीमा माइग्रेशन:स्टार से रिलेशनल

  5. टी-एसक्यूएल में एक स्ट्रिंग से सबस्ट्रिंग कैसे निकालें?