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

BEGIN - END PL/SQL में परमाणु लेनदेन को रोकता है

सबसे पहले, 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;

यदि कोई अपवाद उठाया जाता है, तो सभी प्रविष्टियां और अद्यतन वापस ले लिए जाएंगे; लेकिन जैसे ही आप एक अपवाद हैंडलर जोड़ना चाहते हैं, यह रोलबैक नहीं होगा। इसलिए मैं सेवपॉइंट का उपयोग करके स्पष्ट विधि पसंद करता हूं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle में अल्पविराम से अलग किए गए मान

  2. MYSQL परिणाम में संख्याओं को शब्दों में बदलना! क्वेरी का उपयोग करना

  3. सी ## उपसर्ग के बिना ओरेकल मल्टीटेनेंट 12 सी में उपयोगकर्ता कैसे बनाएं?

  4. क्या JPQL में ऐसी कोई CASE अभिव्यक्ति है?

  5. 2PL, कठोर बनाम सख्त मॉडल, क्या कोई लाभ है?