के कारण म्यूटेटिंग टेबल हमने हाल ही में ओरेकल 10 से ओरेकल 11.2 तक अपग्रेड किया है। अपग्रेड करने के बाद, मैंने एक ट्रिगर की बजाय फ़ंक्शन के कारण एक उत्परिवर्तनीय तालिका त्रुटि को देखना शुरू कर दिया (जिसे मैंने पहले कभी नहीं देखा है)। यह पुराना कोड है जो ओरेकल के पूर्व संस्करणों में काम करता था।ओरेकल 11 में एक फ़ंक्शन
create table mutate (
x NUMBER,
y NUMBER
);
insert into mutate (x, y)
values (1,2);
insert into mutate (x, y)
values (3,4);
मैं दो पंक्तियों बना लिया है:
यहाँ एक परिदृश्य है कि त्रुटि का कारण होगा। अब, मैं इस बयान को फोन करके मेरी पंक्तियों दोगुना कर देंगे:
insert into mutate (x, y)
select x + 1, y + 1
from mutate;
यह नहीं सख्ती से त्रुटि डुप्लिकेट करने के लिए आवश्यक है, लेकिन बाद में मेरी प्रदर्शन के साथ मदद करता है। तो तालिका की सामग्री अब इस तरह दिखती है:
X,Y
1,2
3,4
2,3
4,5
सब ठीक है। अब मजेदार भाग के लिए:
create or replace function mutate_count
return PLS_INTEGER
is
v_dummy PLS_INTEGER;
begin
select count(*)
into v_dummy
from mutate;
return v_dummy;
end mutate_count;
/
मैंने अपनी तालिका पूछने और गिनती वापस करने के लिए एक फ़ंक्शन बनाया है। अब, मैं इसे एक INSERT कथन के साथ जोड़ दूंगा:
insert into mutate (x, y)
select x + 2, y + 2
from mutate
where mutate_count() = 4;
परिणाम? यह त्रुटि:
ORA-04091: table MUTATE is mutating, trigger/function may not see it
ORA-06512: at "MUTATE_COUNT", line 6
तो मैं क्या त्रुटि होती है पता है, लेकिन मैं क्यों जानने के लिए उत्सुक हूँ। ओरेकल चयन का प्रदर्शन नहीं कर रहा है, परिणाम सेट को पुनर्प्राप्त कर रहा है, और फिर उन परिणामों का एक बड़ा सम्मिलन कर रहा है? अगर क्वेरी समाप्त होने से पहले रिकॉर्ड पहले ही डाले जा रहे थे तो मैं केवल एक उत्परिवर्तनीय तालिका त्रुटि की अपेक्षा करता हूं। लेकिन अगर ओरेकल किया था, पहले बयान नहीं होगा कि:
insert into mutate (x, y)
select x + 1, y + 1
from mutate;
अनंत लूप शुरू?
अद्यतन:
जेफरी का लिंक मैं the Oracle docs में यह पाया के माध्यम से:
By default, Oracle guarantees statement-level read consistency. The set of data returned by a single query is consistent with respect to a single point in time.
वहाँ भी his post में लेखक की ओर से एक टिप्पणी है:
One could argue why Oracle doesn't ensure this 'statement-level read consistency' for repeated function calls that appear inside a SQL statement. It could be considered a bug as far as I'm concerned. But this is the way it currently works.
हूँ मैं यह सोचते हैं कि इस में सही कर ओरेकल संस्करण 10 और 11 के बीच व्यवहार बदल गया है?
अच्छा लिंक, धन्यवाद! मैं अपने प्रश्न को अपडेट करने जा रहा हूं और यह देखने के लिए थोड़ा सा खुला हूं कि यह कोई अतिरिक्त चर्चा उत्पन्न करता है या नहीं। –
+1 आपको यह पता चला कि यह क्यों होता है – zep
इससे मदद मिली, लेकिन स्पष्टीकरण प्रश्न है ... क्या फ़ंक्शन एक पैकेज में मौजूद हो सकता है जिसे पहले अपडेट ट्रिगर से कहा जाता है? ओरेकल क्रैपी ट्रिगर्स के कारण मुझे कई अन्य लोगों की तरह दुःस्वप्न हो रहा है। –