2012-06-12 14 views
5

तो मेरे पास 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; 

इस मेरे पूर्ववर्ती द्वारा लिखा गया था लेकिन मूल रूप से सभी यह होता दिया संख्यात्मक मान बारी है और यह धर्मान्तरित में एक अंतराल मूल्य।

कोई भी मदद या सुझावों की बहुत सराहना की जाती है।

धन्यवाद।

+0

क्या आप इस समारोह को सरल बना सकते हैं: 'वापसी सेकंड_इन * (अंतराल' 1 'दूसरा); '? –

+0

आपकी अनुक्रमणिका 'IDX_ATS_CALC_END_TIME' की परिभाषा क्या है? क्या यह एक फ़ंक्शन-आधारित इंडेक्स है? –

+0

http://docs.oracle.com/cd/E11882_01/server.112/e17766/e7500.htm#sthref2691 सुझाव देता है कि यह एक बग हो सकता है। हालांकि सौरभ का जवाब इंगित करता है कि यह गैर-निर्धारिती कार्य के आधार पर फ़ंक्शन-आधारित इंडेक्स के साथ हो सकता है। –

उत्तर

3

मुझे लगता है कि यह हो रहा है क्योंकि आपके ट्रिगर में एक गैर निर्धारक कार्य है -> pb_util.secondtointerval। मैं वास्तव में नहीं जानता कि यह विधि वास्तव में क्या करती है। CALC_END_TIME के ​​बजाय कुछ स्थिर मान निर्दिष्ट करने का प्रयास करें और जांचें कि आपका ट्रिगर काम करता है या नहीं।

समर्थन करने के लिए इस कोड मैं यहाँ के एक छोटे टुकड़े रखकर कर रहा हूँ:

SQL> CREATE TABLE t (a INTEGER) 
Table created. 

SQL> CREATE OR REPLACE FUNCTION f (a INTEGER) 
    RETURN INTEGER "DETERMINISTIC" 
AS 
    cnt INTEGER; 
BEGIN 
    RETURN ROUND ("DBMS_RANDOM.VALUE (1, 100)"); 
END f; 
Function created. 

SQL> CREATE INDEX t_idx ON t (f(a)) COMPUTE STATISTICS 
Index created. 

SQL> INSERT INTO t 
    SELECT ROWNUM 
    FROM user_objects 
5 rows created. 

SQL> DELETE FROM t 
DELETE FROM t 
Error at line 28 
ORA-08102: index key not found, obj# 48928, file 4, block 36 (2) 

आशा है कि यह मदद करता है !!

+0

मैंने pb_util.secondtointerval फ़ंक्शन के लिए कोड शामिल करने के लिए अपना प्रश्न अपडेट किया है। – James213

+0

@ जेम्स 213 क्या आपने फ़ंक्शन से मूल्य लाने के बजाय CALC_END_TIME को कुछ फ़िक्स मान निर्दिष्ट करने का प्रयास किया था? यह आपको बताएगा कि एक गैर निर्धारक कार्य का उपयोग समस्या का मूल कारण है। उदाहरण के लिए। FUNCTION SecondToInterval को संशोधित करें ताकि यह 1 लौटाए और जांच हो कि समस्या मौजूद है या नहीं। ऑरैकल में फ़ंक्शन आधारित इंडेक्स के लिए भी Google। यह तुम्हे मदद करेगा। – Luftwaffe

+0

मैंने calc_end_time को एक निश्चित मान निर्दिष्ट करने का प्रयास किया और यह अभी भी उसी ओरा-त्रुटि के साथ वापस आया। साथ ही जैसे ही मुझे एहसास हुआ कि इंडेक्स एक फ़ंक्शन आधारित इंडेक्स था, मैंने जांच की कि वह क्या कर रहा था और यह सब चल रहा है कॉलम – James213

3

निम्नलिखित का प्रयास करें:

SELECT * 
    FROM ALL_OBJECTS 
    WHERE OBJECT_ID = 97523 

यह आपको वस्तु Oracle के साथ समस्या हो रही है बता देंगे। सबसे अधिक संभावना है कि यह सूचकांक आपको संदेह है, लेकिन शायद नहीं।

साझा करें और आनंद लें।

+0

यह वास्तव में मैंने ऊपर वर्णित त्रुटि में टैग की गई इंडेक्स को खोजने के लिए किया है, लेकिन दूसरों के बारे में जानना अच्छा होगा। धन्यवाद – James213

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