सबसे पहले, BEGIN..END
केवल वाक्य-विन्यास तत्व हैं, और लेन-देन से इसका कोई लेना-देना नहीं है।
दूसरे, Oracle में सभी व्यक्तिगत DML स्टेटमेंट परमाणु होते हैं (अर्थात वे या तो पूर्ण रूप से सफल होते हैं, या पहली विफलता पर किसी भी मध्यवर्ती परिवर्तन को रोलबैक करते हैं) (जब तक कि आप EXCEPTIONS INTO विकल्प का उपयोग नहीं करते हैं, जिसमें मैं यहां नहीं जाऊंगा)।
यदि आप चाहते हैं कि कथनों के समूह को एकल परमाणु लेन-देन के रूप में माना जाए, तो आप ऐसा कुछ करेंगे:
BEGIN
SAVEPOINT start_tran;
INSERT INTO .... ; -- first DML
UPDATE .... ; -- second DML
BEGIN ... END; -- some other work
UPDATE .... ; -- final DML
EXCEPTION
WHEN OTHERS THEN
ROLLBACK TO start_tran;
RAISE;
END;
इस तरह, कोई भी अपवाद इस ब्लॉक में दिए गए कथनों को वापस ले जाने का कारण बनेगा, लेकिन कोई भी कथन जो इस ब्लॉक से पहले चलाए गए थे वापस नहीं लाया जाएगा।
ध्यान दें कि मैं एक COMMIT शामिल नहीं करता - आमतौर पर मैं कमिट जारी करने के लिए कॉलिंग प्रक्रिया को प्राथमिकता देता हूं।
यह सच है कि बिना अपवाद हैंडलर वाला BEGIN..END ब्लॉक स्वचालित रूप से आपके लिए इसे संभाल लेगा:
BEGIN
INSERT INTO .... ; -- first DML
UPDATE .... ; -- second DML
BEGIN ... END; -- some other work
UPDATE .... ; -- final DML
END;
यदि कोई अपवाद उठाया जाता है, तो सभी प्रविष्टियां और अद्यतन वापस ले लिए जाएंगे; लेकिन जैसे ही आप एक अपवाद हैंडलर जोड़ना चाहते हैं, यह रोलबैक नहीं होगा। इसलिए मैं सेवपॉइंट का उपयोग करके स्पष्ट विधि पसंद करता हूं।