Sql 获取的原因(ORA-8102“未找到索引键”)

Sql 获取的原因(ORA-8102“未找到索引键”),sql,oracle,plsql,Sql,Oracle,Plsql,所以我有一个索引为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 BE

所以我有一个索引为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)

提到的索引是基于函数的索引。索引上使用的函数是“计算结束时间”列上的系统提取utc

我花了几天时间试图解决这个问题。我已经重建了索引,我尝试删除并重新创建索引。这两个似乎是这个问题的常见答案,但它们对我不起作用。 我使用以下方法分析了索引:

SELECT *
  FROM ALL_OBJECTS
  WHERE OBJECT_ID = 97523
分析索引IDX\u ATS\u CALC\u END\u时间验证结构

它回来时没有任何问题

我唯一一次能够成功更新此列而不出现此错误的方法是禁用触发器,执行更新,然后再次启用触发器。这对我来说不是一个可行的解决办法

因此,我想知道是否有人遇到过此类问题,以及我可以尝试采取哪些其他步骤来修复此错误

更新: 下面是函数pb_util.secondtointerval()代码:

这是我的前任写的,但基本上它所做的就是将给定的数值转换成一个区间值

非常感谢您的帮助或建议


谢谢。

我认为这是因为触发器有一个非确定性函数->pb_util.second to interval。我真的不知道这个方法的真正作用。尝试将一些静态值指定给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)
希望能有帮助

尝试以下操作:

SELECT *
  FROM ALL_OBJECTS
  WHERE OBJECT_ID = 97523
这将告诉您Oracle的对象存在问题。很可能是你怀疑的指数,但也许不是


分享和享受。

这实际上是我找到上面提到的错误中标记的索引时所做的,但是让其他人知道会更好。谢谢,我已更新了我的问题,将pb_util.secondtointerval函数的代码包括在内。@James213是否尝试为CALC_END_TIME分配一些固定值,而不是从函数中获取值?它会告诉您使用非确定性函数是否是问题的根本原因。例如,修改SecondToInterval函数,使其返回1并检查是否存在问题。此外,谷歌还提供了oracle中基于函数的索引。这会对你有所帮助。我尝试给计算结束时间指定一个固定值,但它仍然返回相同的ora错误。而且,当我意识到索引是基于函数的索引时,我检查了它正在做什么,并且它正在运行的是服务器上的sys\u extract\u utccolumn@James213你有没有在做出改变后放下并重新启动触发器?也请通过这个链接。这可能会有帮助。我浏览了链接(这很好),是的,我确实在做了更改后删除并重新创建了触发器,但它仍然抛出了错误。您能否将函数简化为:
return seconds\u in*(间隔“1”秒)?索引的定义是什么?它是基于函数的索引吗?这可能是一个bug。尽管Saurabh的回答表明,基于非确定性函数的基于函数的索引可能会出现这种情况。这是Oracle的哪个版本?我们在11.2.0.4上有一个类似的问题