Nano Hash - криптовалюты, майнинг, программирование

Причины получения (ключ индекса ORA-8102 не найден)

Итак, у меня есть таблица с индексом IDX_ATS_CALC_END_TIME. Столбец представляет собой значение метки времени. Этот столбец также имеет триггер, который автоматически заполняет столбец при заполнении или обновлении другого столбца (Interval_duration).

Триггер ниже:

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)

Упомянутый индекс является функционирующим индексом. В индексе используется функция sys_extract_utc в столбце calc_end_time.

Я потратил несколько дней, пытаясь решить эту проблему. Я перестроил индекс, я попытался удалить и воссоздать индекс. Эти два кажутся общим ответом на эту проблему, но они не сработали для меня. Я проанализировал индекс, используя следующее:

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;

это было написано моим предшественником, но в основном все, что он делает, это поворачивает заданное числовое значение и преобразует его в значение интервала.

Любая помощь или предложения приветствуются.

Спасибо.

12.06.2012

  • Можете ли вы упростить функцию до: return seconds_in * (interval '1' second);? 12.06.2012
  • Каково определение вашего индекса IDX_ATS_CALC_END_TIME? Это функциональный индекс? 13.06.2012
  • docs.oracle.com/cd/E11882_01/server. 112/e17766/ предполагает, что это может быть ошибка. Хотя ответ Саураба указывает, что это может произойти с индексом на основе функции, основанным на недетерминированной функции. 13.06.2012
  • В какой версии Oracle это? У нас похожая проблема на 11.2.0.4 23.08.2019

Ответы:


1

Попробуйте следующее:

SELECT *
  FROM ALL_OBJECTS
  WHERE OBJECT_ID = 97523

Это скажет вам, с каким объектом у Oracle возникли проблемы. Скорее всего, это индекс, который вы подозреваете, но, возможно, нет.

Делитесь и наслаждайтесь.

12.06.2012
  • На самом деле это то, что я сделал, чтобы найти индекс, отмеченный в упомянутой выше ошибке, но другим было бы полезно знать. Благодарность 12.06.2012

  • 2

    Я думаю, это происходит потому, что ваш триггер имеет недетерминированную функцию -> 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)
    

    Надеюсь, поможет !!

    12.06.2012
  • Я обновил свой вопрос, включив в него код функции pb_util.secondtointerval. 12.06.2012
  • @James213 James213 Пробовали ли вы присвоить CALC_END_TIME некоторое фиксированное значение вместо получения значения из функции? Это скажет вам, является ли использование недетерминированной функции основной причиной проблемы. Например. измените FUNCTION SecondToInterval так, чтобы он возвращал 1, и проверьте, существует ли проблема. Также Google для индексов на основе функций в оракуле. Это поможет вам. 12.06.2012
  • Я попытался присвоить фиксированное значение calc_end_time, и он все равно вернулся с той же ошибкой ora-. Кроме того, как только я понял, что индекс был основан на функции, я проверил, что он делает, и все, что он работает, это sys_extract_utc в столбце. 12.06.2012
  • @ James213 Вы удалили и воссоздали триггер после внесения изменений? Также, пожалуйста, перейдите по этой ссылке. Это может помочь. Указатель на основе функций 12.06.2012
  • Я прошел по ссылке (которая была довольно хорошей), и да, я удалил и воссоздал триггер после внесения изменений, и он все еще выдавал ошибку. 12.06.2012
  • @ James213 Почему-то я не могу воспроизвести ошибку. Если вы узнаете решение, пожалуйста, также разместите его здесь. 13.06.2012
  • Звучит как ошибка для меня. Какая у вас версия Oracle? Можете ли вы воспроизвести эту ошибку на другом экземпляре? 26.07.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..