2013-11-26 11 views
5
DECLARE 
    string_of_5_chars VARCHAR2(5); 
BEGIN 
    BEGIN 
     string_of_5_chars := 'Steven'; 
    EXCEPTION 
     WHEN value_error THEN 
      RAISE no_data_found; 
     WHEN no_data_found THEN 
      dbms_output.Put_line ('Inner block'); 
    END; 
EXCEPTION 
    WHEN no_data_found THEN 
     dbms_output.Put_line ('Outer block'); 
END; 

उत्तर कहता है कि आउटपुट 'बाहरी ब्लॉक' होगा, क्या कोई समझा सकता है कि आंतरिक ब्लॉक निष्पादित क्यों नहीं किया जाएगा? नेस्टेड अपवाद ब्लॉक बारे में अधिक जानकारी के लिए ओरेकलओरेकल नेस्टेड ब्लॉक और अपवाद हैंडलिंग

+0

आप Oracle एक्सप्रेस एडिशन और SQL डेवलपर (दोनों मुक्त) तथा PL/SQL के इस खंड के निष्पादन डिबग डाउनलोड करने की कोशिश की थी? –

उत्तर

8
DECLARE 
string_of_5_chars VARCHAR2(5); 
BEGIN 
BEGIN 
    string_of_5_chars := 'Steven'; // Varchar has a size of 5 defined above. So it will throw a value_error(due to size constraints) exception. 
EXCEPTION 
    WHEN value_error THEN // This exception block will handle the error thrown above. 
     RAISE no_data_found; // It raises a no_data _found exception which by rule has to be handled in the outer exception block. So it goes to the outer exception block. 
    WHEN no_data_found THEN 
     dbms_output.Put_line ('Inner block'); 
END; 
EXCEPTION 
WHEN no_data_found THEN 
    dbms_output.Put_line ('Outer block'); // Exception is handled here which causes it to print 'Outer Block' 
END; 

पढ़ें here में अपवाद की पूर्वता क्या है।

0

string_of_5_chars := 'Steven';value_error उठाता है, संबंधित अपवाद ब्लॉक दर्ज किया जाता है।
अपवाद ब्लॉक के अंदर no_data_found अपवाद उठाया गया है। बढ़ते हिस्से के कारण इस अपवाद को बाहरी ब्लॉक के अपवाद-हैंडलिंग द्वारा नियंत्रित किया जाता है।

अधिक जानकारी के लिए http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/raise_statement.htm

2

आप पर विचार करना चाहिए अपवाद ब्लॉक है जब एक नियमित मामला बयान के समान होने के रूप में खंड। पहली स्थिति जो स्थिति से मेल खाती है, और उस अपवाद हैंडलर में निम्नलिखित WHEN खंडों को छोड़ दिया जाता है।

इसलिए आंतरिक अपवाद ब्लॉक में दूसरा WHEN खंड कोड निष्पादन पथ में नहीं है, और बाहरी अपवाद ब्लॉक ने नेस्टेड अपवाद के पहले WHEN खंड द्वारा उठाए गए no_data_found त्रुटि को पकड़ लिया है। इस परिदृश्य में

अपवाद प्रचार यहाँ समझाया गया है: http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/errors.htm#LNPLS00706

संबंधित मुद्दे