यह एक Oracle बग है।
यह एक NOT NULL
. दोनों के साथ एक कॉलम जोड़कर ट्रिगर होता है बाधा और एक DEFAULT
मौजूदा तालिका के लिए मान।
कॉलम को जल्दी से जोड़ने के लिए, Oracle 11g डेटा डिक्शनरी में डिफ़ॉल्ट मान को संग्रहीत करता है। Oracle इसे "कॉलम ऑप्टिमाइज़ेशन जोड़ें" कहते हैं।
यह प्रत्येक तालिका पंक्ति में डिफ़ॉल्ट मान लिखने से तेज़ है। क्वेरी इंजन को तब तालिका पंक्ति में किसी भी NULL को डेटा डिक्शनरी से डिफ़ॉल्ट मान के साथ बदलना चाहिए। दुर्भाग्य से इससे संबंधित कई बग हैं। आपका एक उदाहरण प्रतीत होता है:
आप देख सकते हैं कि कौन से कॉलम इस तरह जोड़े गए हैं:
select owner, object_name, name
from dba_objects, col$
where bitand(col$.PROPERTY,1073741824)=1073741824
and object_id=obj#;
हमारे मामले में, हमें एक अलग बग ने डंक मार दिया, जिसने SELECT FOR UPDATE
के लिए गलत परिणाम दिए। ।
हम पैरामीटर सेट करते हैं _add_col_optim_enabled=FALSE
इस "अनुकूलन" को बंद करने के लिए। वैकल्पिक रूप से, आप बाद के Oracle संस्करण में अपग्रेड करने में सक्षम हो सकते हैं जहां इन बगों का समाधान किया जाता है।
उपरोक्त पैरामीटर को अपग्रेड या सेट करने से आपकी मौजूदा तालिका ठीक नहीं होगी, जो दूषित है। आपको उस तालिका को फिर से बनाना होगा।