यह एक दिलचस्प सवाल है!
जब ओरेकल में कोई त्रुटि आती है, तो यह वर्तमान स्टेटमेंट को लेनदेन नहीं करेगा, लेनदेन नहीं। एक कथन किसी भी शीर्ष-स्तरीय निर्देश है, यह एक SQL कथन (INSERT, अद्यतन ...) या एक पीएल/एसक्यूएल ब्लॉक हो सकता है।
इसका मतलब है कि जब एक बयान (उदाहरण के लिए जावा से बुलाया गया एक पीएल/एसक्यूएल प्रक्रिया) एक त्रुटि देता है, ओरेकल लेनदेन को उसी तर्कसंगत स्थिति में कॉल के पहले रखेगा। यह बेहद सहायक है, आपको आधा निष्पादित प्रक्रियाओं (**) के बारे में चिंता करने की ज़रूरत नहीं है।
This thread on AskTom covers the same topic:
[बयान] या तो पूरी तरह से होता है या यह पूरी तरह से नहीं होता है और तरीका है कि काम करता है डेटाबेस के तार्किक बराबर करता है:
begin
savepoint foo;
<<your statement>>
exception
when others then rollback to foo;
RAISE;
end;
यह फीचर, मेरी राय में, किसी अन्य भाषा की तुलना में pl/sql में डेटाबेस कोड (*) लिखना बहुत आसान है।
(*) कोड जो ओरेकल डीबी के साथ इंटरैक्ट करता है, मुझे लगता है कि अन्य डीबीएमएस की मूल प्रक्रियात्मक भाषाओं में समान विशेषताएं हैं।
(**) ओरेकल में DDL are not transactional के बाद से यह केवल डीएमएल से संबंधित है। कुछ डीबीएमएस पैकेजों से सावधान रहें जो डेटा डिक्शनरी (जैसे DBMS_STATS
) अपडेट करते हैं, वे अक्सर डीडीएल जैसे परिवर्तन करते हैं और जारी करते हैं। संदेह के मामले में documentation का संदर्भ लें।
अद्यतन:
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
ओरेकल है: इस व्यवहार PL/SQL में सबसे महत्वपूर्ण अवधारणा में से एक है, मैं एक छोटा सा उदाहरण PL/SQL विवरणों की atomicity प्रदर्शित करने के लिए प्रदान करेगा पी 1 को कॉल करने से ठीक पहले लेनदेन को बिंदु पर वापस लाया। कोई आधा काम नहीं किया गया है। ऐसा लगता है कि प्रक्रिया पी 1 कभी नहीं बुलाया गया था।
वास्तव में, यह मेरे लिए एक बहुत ही रोचक सवाल की तरह लगता है। पोस्टग्रेस त्रुटि पर रोलबैक, और मुझे अक्सर यह परेशान लगता है (और आश्चर्य हुआ कि ओरेकल ने कुछ ऐसा किया था)। – jsight
मुझे बताएं, यदि आप त्रुटियों पर रोलबैक नहीं चाहते हैं तो आप लेनदेन का उपयोग क्यों कर रहे हैं? यह लेनदेन के मुख्य उद्देश्यों में से एक है। –
@ ओलिवर: मुझे जरूरी नहीं है कि वे चाहते हैं या नहीं चाहते हैं। मैं सिर्फ यह जानना चाहता हूं कि वे कैसे काम करते हैं। –