यह एक दिलचस्प सवाल है!
जब 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 को कभी नहीं बुलाया गया था।