फंक्शन / प्रक्रिया में डीएमएल ऑपरेशन के बाद आवश्यक है?


20

मुझे यह जानकर आश्चर्य हुआ कि क्या फ़ंक्शन / प्रक्रिया में सम्मिलित / हटाने / अद्यतन करने के बाद यह लिखना आवश्यक है?

उदाहरण:

create or replace function test_fun
return number is
begin
   delete from a;
   return 0;
end;

या प्रक्रिया

create or replace procedure aud_clear_pro
as
begin
   delete from a;
end;

हटाने के बाद क्या इसकी आवश्यकता है?

निम्नलिखित स्थिति को समझ नहीं सकता:

  1. यदि मैं SQL विंडो से फ़ंक्शन / प्रक्रिया को कॉल करता हूं, तो इसके लिए प्रतिबद्ध होना चाहिए

    परंतु

  2. यदि मैं dbms_scheduler का उपयोग करके फ़ंक्शन / प्रक्रिया को शेड्यूल करता हूं और काम चलाता हूं, तो स्टेटमेंट हटाएं स्वचालित रूप से प्रतिबद्ध है।

    क्यों?

जवाबों:


24

सामान्य तौर पर, प्रक्रियाओं को प्रतिबद्ध नहीं होना चाहिए। लेन-देन नियंत्रण निर्णयों के उन प्रकारों को उच्च-स्तरीय कोड पर छोड़ दिया जाना चाहिए जो जानते हैं कि वास्तव में तार्किक लेनदेन कब पूरा होता है। यदि आप एक संग्रहीत प्रक्रिया के अंदर करते हैं, तो आप इसकी पुन: प्रयोज्यता को सीमित कर रहे हैं क्योंकि एक कॉलर जो प्रक्रिया में बदलाव करना चाहता है वह एक बड़े लेनदेन का हिस्सा है, बस प्रक्रिया को सीधे कॉल नहीं कर सकता है।

यदि आप एक प्रक्रिया को अंतःक्रियात्मक रूप से कहते हैं, तो आपको लेन-देन को स्पष्ट रूप से कमिट या रोलबैक करना होगा क्योंकि ऑरेकल के पास कोई विचार नहीं है यदि आप प्रक्रिया कॉल को तार्किक लेन-देन करने का इरादा रखते हैं या यदि आप कई प्रक्रिया कॉलों को शामिल करने वाले बड़े लेनदेन की रचना करना चाहते हैं। यदि आप उपयोग करते हैं dbms_scheduler, तो dbms_schedulerमान लेते हैं कि नौकरी एक तार्किक लेनदेन है और नौकरी के अंत में यह मानते हुए कि यह सफल था ( dbms_jobवही काम करता है)।

फ़ंक्शंस को पहली बार में डेटा में हेरफेर नहीं करना चाहिए। एक फ़ंक्शन जो डेटा में हेरफेर करता है, उसे एसक्यूएल स्टेटमेंट (कोने के मामले को छोड़कर जहां फ़ंक्शन स्वयं को एक स्वायत्त लेनदेन का उपयोग करने के लिए घोषित किया जाता है) से कॉल नहीं किया जा सकता है)। फ़ंक्शंस और प्रक्रिया दोनों होने की पूरी बात यह है कि फ़ंक्शन एसक्यूएल स्टेटमेंट्स में एम्बेड किए जा सकते हैं और उपयोगकर्ताओं को अधिक स्वतंत्र रूप से प्रदान किए जा सकते हैं क्योंकि वे अपना डेटा नहीं बदलते हैं।


1
क्या ओरेकल में यह संभव नहीं है कि कॉल करने वाले के लिए एक लेनदेन शुरू हो जो प्रक्रिया कॉल को बांधता है? SQL सर्वर में आप प्रक्रिया के अंदर कमिट कर सकते हैं, लेकिन यदि कॉलर ने उस प्रक्रिया को कॉल करने से पहले लेन-देन खोला है, तो कॉल करने वाले के आने तक भी कुछ भी प्रतिबद्ध नहीं है।
निक चामास

4
@NickChammas - Oracle में नेस्टेड ट्रांजेक्शन की अवधारणा नहीं है, नहीं। यदि प्रक्रिया शुरू होती है, तो कॉल करने वाले ने उस बिंदु तक काम किया होगा। कॉल करने वाला हमेशा अपने पहले कथन (चाहे वह एक प्रक्रिया कॉल या कुछ और हो) के साथ एक लेनदेन शुरू करता है, इसलिए लेन-देन को समाप्त करने के लिए हमेशा कॉल करने वाले पर निर्भर होना चाहिए।
जस्टिन गुफा

@JustinCave Whilst यह सच है, स्वायत्त लेनदेन के बारे में मत भूलना।
फिलु

@Phil - सच है, लेकिन यह एक बहुत अलग जानवर है। एक स्वायत्त लेनदेन कॉलर द्वारा किए गए अनपेक्षित परिवर्तनों को नहीं देख सकता है और कॉलर द्वारा वापस रोल नहीं किया जा सकता है, इसलिए यह बहुत संभावना नहीं है कि एक स्वायत्त लेनदेन का उपयोग करने के लिए घोषित प्रक्रिया के अलावा कुछ भी नहीं होना चाहिए।
जस्टिन केव

4

तुम्हारे प्रश्न का उत्तर देने के लिए; क्यों?

आप शायद यह पहले से ही जानते हैं कि पोस्ट 2 साल पुरानी है। लेकिन मैं सिर्फ रिकॉर्ड के लिए जवाब दूंगा।

# 1 कारण के लिए एक कमिट की आवश्यकता होती है और # 2 नहीं होता है क्योंकि ओरेकल में डिफ़ॉल्ट डेटाबेस सेटिंग एक सत्र समाप्त होने पर लेनदेन करने के लिए होती है। यदि आप sqlplus में हैं और अपना कोड मैन्युअल रूप से चलाते हैं, तो यह तुरंत लेनदेन नहीं करेगा। यदि आप एक स्पष्ट प्रतिबद्ध जारी करते हैं या आप sqlpus से लॉग ऑफ करते हैं, तो लेनदेन प्रतिबद्ध होगा।

# 2 पर आपको स्वचालित कमिटमेंट मिलने का कारण यह है कि यह आपकी स्क्रिप्ट को चलाने के लिए एक सत्र बनाता है। जब यह पूरा हो जाता है तो यह स्वचालित रूप से लॉग ऑफ हो जाता है, जिससे स्वचालित कमिट आ जाएगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.