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

DML और एक्सेप्शन हैंडलिंग - Oracle

आपने पुस्तक के कुछ अन्य भागों को याद किया। हां, स्टीवन सच है - यदि किसी ब्लॉक में कोई अपवाद होता है, तो सभी पूर्ववर्ती डीएमएल प्रभाव यथावत रहते हैं। फिर भी, पुस्तक में अन्य उल्लेख होना चाहिए कि कोई भी शीर्ष-स्तरीय 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 प्रभाव यथावत रहेगा। (और चूंकि उस ब्लॉक में कोई प्रतिबद्धता नहीं है, आप अंत में एक लेन-देन प्रगति पर हैं।)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. dblink भर में चुनें और डालें

  2. Oracle:किसी अन्य उपयोगकर्ता के लिए स्कीमा के लिए केवल-पढ़ने के लिए पहुँच?

  3. oracle में एक प्रकार बनाते समय PLS-00201 त्रुटि प्राप्त करना

  4. OracleCommand SQL पैरामीटर्स बाइंडिंग

  5. sys_refcursor से किसी अन्य प्रक्रिया से प्राप्त करें और थोक एकत्र करें और दूसरी तालिका में डालें