2012-08-15 10 views
44

में ईएनडी ब्लॉक परमाणु लेनदेन यह जानकारी ढूंढना आसान होना चाहिए, लेकिन मुझे कोई भाग्य नहीं मिला है।BEGIN - पीएल/एसक्यूएल

जब मैं एक PL/SQL में एक BEGIN - END ब्लॉक है, यह एक परमाणु लेन-देन, कि END ब्लॉक मार पर और अगर कुछ गलत रोल बैक परिवर्तन हो जाता है प्रतिबद्ध करने के लिए कोशिश करेंगे के रूप में व्यवहार करता है?

यदि नहीं, तो मैं कैसे सुनिश्चित करूं कि BEGIN - END ब्लॉक के अंदर कोड परमाणु लेनदेन की तरह व्यवहार करता है और ब्लॉक "डिफ़ॉल्ट रूप से" कैसे व्यवहार करता है?

संपादित करें: मैं संग्रहीत प्रक्रिया से चल रहा हूं और मैं एक अंतर्निहित ब्लॉक का उपयोग कर रहा हूं, मुझे लगता है।

+0

यदि आपको वह व्यवहार है जिसे आप ढूंढ रहे हैं तो आपको स्पष्ट 'COMMIT' और' रोलबैक 'कथन (शायद' EXCEPTION' अनुभाग में) जारी करना चाहिए। यदि आप वास्तव में परमाणु लेनदेन चाहते हैं, तो ओरेकल में AUTONOMOUS_TRANSACTIONS देखें। – Ollie

उत्तर

57

सबसे पहले, BEGIN..END केवल वाक्य रचनात्मक तत्व हैं, और लेनदेन के साथ कुछ भी नहीं है।

दूसरा, ओरेकल में सभी व्यक्तिगत डीएमएल कथन परमाणु होते हैं (यानी वे या तो पूर्ण रूप से सफल होते हैं, या पहली विफलता पर किसी मध्यवर्ती परिवर्तन को रोलबैक करते हैं) (जब तक कि आप विकल्प में विकल्प का उपयोग नहीं करते हैं, जिसे मैं यहां नहीं जाऊंगा) ।

आप बयान एकल परमाणु सौदे के रूप में इलाज किया जाना है के एक समूह चाहते हैं, तो आप इस तरह कुछ करना चाहते हैं:

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; 

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

+0

क्या यह एक लेनदेन है यदि अपवाद हैंडलिंग के साथ नेस्टेड ब्लॉक का उपयोग करना है लेकिन मुख्य/बाहरी ब्लॉक में कोई अपवाद हैंडलिंग नहीं है? –

+0

@ जॉनीलेड्स, नहीं, यह एक लेनदेन है जब आप डीएमएल कथन चलाते हैं। –

0

आप उल्लेख नहीं करते हैं कि यह एक अज्ञात पीएल/एसक्यूएल ब्लॉक है या एक घोषणात्मक है यानी। पैकेज, प्रक्रिया या समारोह। हालांकि, पीएल/एसक्यूएल में एक COMMIT को आपके लेनदेन को डेटाबेस में सहेजने के लिए स्पष्ट रूप से बनाया जाना चाहिए। COMMIT वास्तव में सभी मौजूदा सहेजे गए लेन-देन को आपके वर्तमान उपयोगकर्ता के सत्र से डेटाबेस में सहेजता है।

यदि कोई त्रुटि होती है तो लेनदेन पूरी तरह से रोलबैक करता है।

यह पीएल/एसक्यूएल के लिए डिफ़ॉल्ट व्यवहार है।

+1

मुझे यकीन नहीं है कि यह कहना सही है कि * लेनदेन * रोलबैक करता है; पीएल/एसक्यूएल ब्लॉक से पहले किए गए किसी भी असामान्य परिवर्तन अभी भी लंबित हैं और ग्राहक द्वारा प्रतिबद्ध या लुढ़कने की आवश्यकता है। ब्लॉक के भीतर किए गए किसी भी कदम को वापस ले जाया जाएगा, जैसे कि एक बचत बिंदु पर, जो मुझे लगता है कि आपका क्या मतलब है। (हमेशा की तरह, [टॉम मुझसे बेहतर बता सकता है] (http://asktom.oracle.com/pls/asktom/f?p=100:11TP:::P11_QUESTION_ID:43818437682131))। मुझे यह भी यकीन नहीं है कि क्या ओपी एक ब्लॉक के भीतर घोंसला वाले ब्लॉक के बारे में पूछ रहा है, और क्या आंतरिक ब्लॉक में परिवर्तन स्वतंत्र रूप से वापस/घुमाए जाएंगे। –

5

BEGIN - END ब्लॉक पीएल/एसक्यूएल के निर्माण ब्लॉक हैं, और प्रत्येक पीएल/एसक्यूएल इकाई कम से कम एक ऐसे ब्लॉक में निहित है। नेस्टिंग BEGIN - END पीएल/एसक्यूएल ब्लॉक के भीतर ब्लॉक आमतौर पर कुछ अपवादों को फँसाने और उस विशेष अपवाद को संभालने के लिए किया जाता है और फिर असंबंधित अपवादों को बढ़ाता है। फिर भी, पीएल/एसक्यूएल में आप (ग्राहक) को हमेशा लेनदेन के लिए प्रतिबद्ध या रोलबैक जारी करना होगा।

यदि आप पीएल/एसक्यूएल युक्त लेनदेन वाले परमाणु लेनदेन करना चाहते हैं, तो आपको घोषणा ब्लॉक में PRAGMA AUTONOMOUS_TRANSACTION घोषित करने की आवश्यकता है। यह सुनिश्चित करेगा कि उस ब्लॉक के भीतर किसी भी डीएमएल को लेनदेन के स्वतंत्र रूप से प्रतिबद्ध या रोलडबैक किया जा सकता है।

हालांकि, आप नेस्टेड ब्लॉक के लिए इस प्रगति की घोषणा नहीं कर सकते हैं। आप केवल के लिए यह घोषणा कर सकते हैं:

  • उच्च-स्तरीय (नेस्टेड नहीं) गुमनाम PL/SQL ब्लॉक
  • सूची आइटम
  • स्थानीय, स्टैंडअलोन और पैक कार्यों और प्रक्रियाओं
  • किसी SQL वस्तु की
  • तरीके टाइप
  • डाटाबेस से चलाता है

संदर्भ: Oracle

संबंधित मुद्दे