आपने पुस्तक के कुछ अन्य भागों को याद किया। हां, स्टीवन सच है - यदि किसी ब्लॉक में कोई अपवाद होता है, तो सभी पूर्ववर्ती डीएमएल प्रभाव यथावत रहते हैं। फिर भी, पुस्तक में अन्य उल्लेख होना चाहिए कि कोई भी शीर्ष-स्तरीय SQL या PL/SQL कथन (अर्थात, अनाम ब्लॉक भी) निष्पादन उस कथन के लिए एक कर्सर खोलता है और यदि कर्सर के निष्पादन के दौरान कोई अपवाद है, तो सभी DML प्रभाव किए गए कर्सर के निष्पादन के दौरान वापस लुढ़क जाते हैं। शायद एक साधारण उदाहरण आपको सुराग देगा...
अपने मूल उदाहरण में, आपने निष्पादित किया ...
BEGIN
DELETE FROM dml_exception;
raise value_error;
END;
... शीर्ष-स्तरीय बयान के रूप में। हां, ब्लॉक के अंत में, हालांकि अभी भी भीतर, आपका delete
प्रभाव यथावत रहा। फिर भी, आपके ब्लॉक ने एक अपवाद उठाया जो शीर्ष-स्तरीय कर्सर तक सभी तरह से प्रचारित हो गया। इस प्रकार, परमाणुता
के सिद्धांतों का पालन करने के लिए , Oracle ने खुले हुए कर्सर के सभी लंबित प्रभावों को वापस ले लिया।
यदि आप अपने पीएल/एसक्यूएल ब्लॉक को किसी अन्य शीर्ष-स्तरीय पीएल/एसक्यूएल ब्लॉक के भीतर से कॉल करते हैं, जो निचले स्तर के पीएल/एसक्यूएल ब्लॉक में उठाए गए अपवाद को संभालता है और फिर से नहीं उठाता है, ...
BEGIN
BEGIN
DELETE FROM dml_exception;
raise value_error;
END;
EXCEPTION
WHEN others THEN NULL;
END;
..., फिर आपका delete
प्रभाव यथावत रहेगा। (और चूंकि उस ब्लॉक में कोई प्रतिबद्धता नहीं है, आप अंत में एक लेन-देन प्रगति पर हैं।)