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

क्या Oracle किसी त्रुटि पर लेन-देन वापस लेता है?

यह एक दिलचस्प सवाल है!

जब Oracle किसी त्रुटि का सामना करता है, तो यह वर्तमान कथन . को वापस ले लेगा , लेन-देन नहीं। एक कथन कोई भी शीर्ष-स्तरीय निर्देश है, यह एक SQL कथन (INSERT, UPDATE...) या एक PL/SQL ब्लॉक हो सकता है।

इसका मतलब यह है कि जब एक बयान (उदाहरण के लिए जावा से बुलाया गया एक pl/sql प्रक्रिया) एक त्रुटि देता है, तो ओरेकल लेनदेन को उसी तार्किक स्थिति में रखेगा जैसे कॉल से पहले। यह बेहद मददगार है, आपको आधी-अधूरी प्रक्रियाओं (**) के बारे में चिंता करने की ज़रूरत नहीं है।

आस्कटॉम के इस थ्रेड में इसी विषय को शामिल किया गया है:

<ब्लॉकक्वॉट>

[कथन] या तो पूरी तरह से होता है या यह पूरी तरह से नहीं होता है और जिस तरह से काम करता है वह डेटाबेस तार्किक समकक्ष करता है:

begin
   savepoint foo;
   <<your statement>>
exception
   when others then rollback to foo; 
                    RAISE;
end;

यह सुविधा, मेरी राय में, किसी भी अन्य भाषा की तुलना में pl/sql में डेटाबेस कोड (*) लिखना बहुत आसान है।

(*) कोड जो निश्चित रूप से Oracle DB के साथ इंटरैक्ट करता है, मुझे लगता है कि अन्य DBMS की मूल प्रक्रियात्मक भाषाओं में समान विशेषताएं हैं।

(**) यह केवल डीएमएल से संबंधित है क्योंकि डीडीएल ओरेकल में लेन-देन नहीं कर रहा है। कुछ डीबीएमएस पैकेजों से भी सावधान रहें जो डेटा डिक्शनरी को अपडेट करते हैं (जैसे DBMS_STATS ), वे अक्सर डीडीएल जैसे बदलाव करते हैं और इश्यू कमिट करते हैं। संदेह के मामले में दस्तावेज़ीकरण देखें।

अपडेट करें: यह व्यवहार PL/SQL में सबसे महत्वपूर्ण अवधारणाओं में से एक है, मैं pl/sql कथनों की परमाणुता को प्रदर्शित करने के लिए एक छोटा सा उदाहरण प्रदान करूंगा। :

SQL> CREATE TABLE T (a NUMBER);

Table created

SQL> CREATE OR REPLACE PROCEDURE p1 AS
  2  BEGIN
  3     -- this statement is successful
  4     INSERT INTO t VALUES (2);
  5     -- this statement will raise an error
  6     raise_application_error(-20001, 'foo');
  7  END p1;
  8  /

Procedure created

SQL> INSERT INTO t VALUES (1);

1 row inserted

SQL> EXEC p1;

begin p1; end;

ORA-20001: foo
ORA-06512: at "VNZ.P1", line 5
ORA-06512: at line 2

SQL> SELECT * FROM t;

         A
----------
         1

Oracle ने p1 को कॉल करने से ठीक पहले लेन-देन को वापस ले लिया है। कोई आधा काम नहीं हुआ है। यह ऐसा है जैसे प्रक्रिया p1 को कभी नहीं बुलाया गया था।



  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. Oracle डेटाबेस में SET DEFINE OFF का उपयोग कब या क्यों करें?

  3. प्रदर्शन ट्यूनिंग भूलभुलैया

  4. Oracle में UTL_FILE पैकेज का उपयोग करके ExcelSheet में लेखन

  5. समय के साथ डेटा का मूल्य