तो मेरे पास IDX_ATS_CALC_END_TIME नामक इंडेक्स वाली एक टेबल है। कॉलम एक टाइमस्टैम्प मान है। इस कॉलम में एक ट्रिगर भी होता है जो कॉलम को स्वचालित रूप से पॉप्युलेट करता है जब कोई अन्य कॉलम (इंटरवल_डिशन) पॉप्युलेट या अपडेट होता है।प्राप्त करने के कारण (ओआरए -8102 "इंडेक्स कुंजी नहीं मिली")
ट्रिगर नीचे है:
TRIGGER "DATAMART"."TRG_ATS_CALC_END_TIME"
BEFORE INSERT OR UPDATE OF INTERVAL_DURATION ON DATAMART.AGG_TIME_SUMMARY
FOR EACH ROW
DECLARE
BEGIN
IF :New.INTERVAL_DURATION > 0 THEN
:New.calc_end_time := :New.start_date_time + pb_util.secondtointerval(:New.INTERVAL_DURATION);
ELSE
:NEW.CALC_END_TIME := :New.start_date_time;
END IF;
EXCEPTION
WHEN OTHERS THEN
pb_util.logdata(1, 'TRG_ATS_CALC_END_TIME', 'Exception Thrown in interval: ' || :New.Interval_DURATION, SQLERRM || ' stack: ' || dbms_utility.format_error_backtrace);
END TRG_ATS_CALC_END_TIME;
जब मेरी मेज शुरू में आबादी वाले है वहाँ कोई समस्या नहीं हैं। मेरी समस्या यह है कि जब मैं मेज पर एक सम्मिलित/अपडेट करते हैं और या तो सीधे स्तंभ को बदलने या सिर्फ interval_duration स्तंभ मैं इस त्रुटि फेंक दिया है अपडेट करके इस स्तंभ को संशोधित करने की कोशिश करने के लिए जाना:
ORA-08102: इंडेक्स कुंजी नहीं मिली, obj # 97523, फ़ाइल 4, ब्लॉक 244 (2)
उल्लिखित सूचकांक एक कार्यरत सूचकांक है। इंडेक्स पर इस्तेमाल किया जाने वाला फ़ंक्शन calc_end_time कॉलम पर sys_extract_utc है।
मैंने इस मुद्दे को हल करने की कोशिश करने में कई दिन बिताए हैं। मैंने इंडेक्स का पुनर्निर्माण किया है, मैंने इंडेक्स को हटाने और पुनर्निर्माण करने का प्रयास किया है। ये दोनों इस समस्या के लिए आम जवाब प्रतीत होते हैं, लेकिन वे मेरे लिए काम नहीं करते थे। मैं निम्नलिखित का उपयोग कर सूचकांक का विश्लेषण किया है:
ANALYZE INDEX IDX_ATS_CALC_END_TIME VALIDATE STRUCTURE;
और यह कोई समस्या नहीं के साथ वापस आ गया।
एकमात्र बार मैं इस त्रुटि को प्राप्त किए बिना इस कॉलम को सफलतापूर्वक अपडेट करने में सक्षम हूं, ट्रिगर को अक्षम करके, अद्यतन कर रहा था, और फिर एक बार फिर ट्रिगर को सक्षम कर रहा था। यह मेरे लिए एक व्यवहार्य समाधान नहीं है।
तो मैं जानना चाहता हूं कि किसी ने कभी इस प्रकार की समस्या का सामना किया है और मैं इस त्रुटि को ठीक करने के लिए अन्य कदमों का प्रयास कैसे कर सकता हूं।
अद्यतन: आप नीचे दिए गए समारोह pb_util.secondtointerval() कोड मिलेगा:
FUNCTION SecondToInterval
(Seconds_IN NUMBER
)
RETURN CONST.PBInterval
IS
sec NUMBER(20, 9);
days NUMBER;
hours NUMBER;
minutes NUMBER;
seconds NUMBER(20, 9);
IntervalAsText NVARCHAR2(32);
ReturnInterval INTERVAL DAY(9) TO SECOND(9);
begin
sec := NVL(Seconds_IN, 0);
days := trunc(sec/(24*60*60));
sec := sec - days*24*60*60;
hours := trunc(sec/(60*60));
sec := sec - hours*60*60;
minutes := trunc(sec/60);
sec := sec - minutes*60;
seconds := trunc(sec);
sec := sec - seconds;
sec := trunc(1000000000*sec);
IntervalAsText := cast(days as nvarchar2)
|| ' ' || cast(hours as nvarchar2)
|| ':' || substr('00' || cast(minutes as nvarchar2), -2, 2)
|| ':' || substr('00' || cast(seconds as nvarchar2), -2, 2)
|| '.' || substr('000000000' || cast(sec as nvarchar2), -9, 9);
--dbms_output.put_line(intervalastext);
ReturnInterval := TO_DSInterval(IntervalAsText);
--ReturnInterval := TO_DSInterval('999999999 23:59:59.999999999');
--dbms_output.put_line(ReturnInterval);
RETURN ReturnInterval;
EXCEPTION
WHEN OTHERS THEN
pb_util.logdata(1, 'PB_UTIL.SecondToInterval', 'ERROR(99A): ', intervalastext);
dbms_output.put_line(intervalastext);
RAISE;
end SecondToInterval;
इस मेरे पूर्ववर्ती द्वारा लिखा गया था लेकिन मूल रूप से सभी यह होता दिया संख्यात्मक मान बारी है और यह धर्मान्तरित में एक अंतराल मूल्य।
कोई भी मदद या सुझावों की बहुत सराहना की जाती है।
धन्यवाद।
क्या आप इस समारोह को सरल बना सकते हैं: 'वापसी सेकंड_इन * (अंतराल' 1 'दूसरा); '? –
आपकी अनुक्रमणिका 'IDX_ATS_CALC_END_TIME' की परिभाषा क्या है? क्या यह एक फ़ंक्शन-आधारित इंडेक्स है? –
http://docs.oracle.com/cd/E11882_01/server.112/e17766/e7500.htm#sthref2691 सुझाव देता है कि यह एक बग हो सकता है। हालांकि सौरभ का जवाब इंगित करता है कि यह गैर-निर्धारिती कार्य के आधार पर फ़ंक्शन-आधारित इंडेक्स के साथ हो सकता है। –