在非表所在表空间创建Oracle Text Context索引报错求助
Oracle Text Context索引创建错误排查(ORA-29855/DRG-11000)
问题场景
需要在与表ATTACH不同的表空间IDX中,针对BLOB类型字段ATTACH_BIN创建Context类型的Oracle Text索引,执行的SQL语句如下:
CREATE INDEX ATT_INDEX ON ATTACH(ATTACH_BIN) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('DATASTORE CTXSYS.DEFAULT_DATASTORE SYNC(EVERY trunc(sysdate + 1))') TABLESPACE IDX;
报错信息
执行后触发以下错误:
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine ORA-20000: Oracle Text error: DRG-11000: invalid keyword ( ORA-06512: at "CTXSYS.DRUE", line 186 ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 320 00000 - "error occurred in the execution of ODCIINDEXCREATE routine" *Cause: Failed to successfully execute the ODCIIndexCreate routine.
错误原因
DRG-11000错误直接指向参数语法非法,具体问题出在SYNC参数的写法上:
- Oracle Text的
SYNC子句中,EVERY后面必须跟时间间隔表达式(如"1" DAY),不能直接嵌套PL/SQL函数(trunc(sysdate + 1))。 - 原语句中
SYNC(EVERY trunc(sysdate + 1))的语法不符合Oracle Text参数规范,导致解析失败。
解决方法
1. 修正SYNC参数语法
根据需求选择以下合法的SYNC写法:
- 每日自动同步一次:使用时间间隔表达式
CREATE INDEX ATT_INDEX ON ATTACH(ATTACH_BIN) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('DATASTORE CTXSYS.DEFAULT_DATASTORE SYNC(EVERY "1" DAY)') TABLESPACE IDX;
- 指定每日凌晨1点同步:使用SCHEDULE子句(基于Oracle Scheduler语法)
CREATE INDEX ATT_INDEX ON ATTACH(ATTACH_BIN) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('DATASTORE CTXSYS.DEFAULT_DATASTORE SYNC(SCHEDULE ''FREQ=DAILY;BYHOUR=1'')') TABLESPACE IDX;
注意:SCHEDULE字符串需要用双单引号转义,避免与外层参数的单引号冲突。
2. 额外注意事项
- 确保表空间
IDX已存在,且当前用户拥有在该表空间创建索引的权限。 - 若
ATTACH_BIN字段存储的是非纯文本格式的文档(如PDF、Word),需额外配置FILTER CTXSYS.AUTO_FILTER参数,否则可能无法正确索引内容:
CREATE INDEX ATT_INDEX ON ATTACH(ATTACH_BIN) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('DATASTORE CTXSYS.DEFAULT_DATASTORE FILTER CTXSYS.AUTO_FILTER SYNC(EVERY "1" DAY)') TABLESPACE IDX;
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

