如何解决Oracle 18g中DRG-10599:列未索引错误
解决Oracle Text CATSEARCH报错DRG-10599的步骤
1. 修正索引类型与查询函数的匹配问题
你的查询使用CATSEARCH,但创建的是CONTEXT类型索引——这是核心矛盾:
CONTAINS查询对应CONTEXT类型索引CATSEARCH查询对应CTXCAT类型索引
生产库中你创建的LACT_TITLE_TI是CONTEXT索引,无法被CATSEARCH识别,因此报错。测试库能正常运行,大概率是测试库存在对应的CTXCAT索引。
修复操作:创建匹配的CTXCAT索引
执行以下语句创建符合要求的CTXCAT索引:
-- 方案1:直接创建单字段CTXCAT索引 CREATE INDEX CR.LACT_TITLE_TCAT ON CR.MJ_LACTS(TITLE) INDEXTYPE IS CTXSYS.CTXCAT; -- 方案2:若需关联其他字段做复合查询,先创建索引集 BEGIN CTX_DDL.CREATE_INDEX_SET('CR.LACT_TITLE_CTXSET'); CTX_DDL.ADD_INDEX('CR.LACT_TITLE_CTXSET', 'TITLE'); -- 若后续需要按其他字段过滤,可添加更多字段,例如:CTX_DDL.ADD_INDEX('CR.LACT_TITLE_CTXSET', 'STATUS_ID'); END; / CREATE INDEX CR.LACT_TITLE_TCAT ON CR.MJ_LACTS(TITLE) INDEXTYPE IS CTXSYS.CTXCAT PARAMETERS('INDEX_SET CR.LACT_TITLE_CTXSET');
创建完成后重新执行查询即可。
2. 验证视图MY_VIEW_TABLE的定义
确保视图中的TITLE列直接映射到CR.MJ_LACTS.TITLE,没有做函数转换(比如UPPER(TITLE)、SUBSTR(TITLE, ...))。如果视图中对TITLE做了转换,需要将CTXCAT索引建在对应的表达式上:
-- 示例:若视图中使用UPPER(TITLE) CREATE INDEX CR.LACT_TITLE_UPPER_TCAT ON CR.MJ_LACTS(UPPER(TITLE)) INDEXTYPE IS CTXSYS.CTXCAT;
查询视图定义的语句:
SELECT TEXT FROM ALL_VIEWS WHERE VIEW_NAME = 'MY_VIEW_TABLE' AND OWNER = '<你的查询用户>';
3. 检查索引状态与同步
如果创建CTXCAT索引后仍报错,检查索引的有效性:
SELECT INDEX_NAME, STATUS, DOMIDX_STATUS FROM ALL_INDEXES WHERE INDEX_NAME = 'LACT_TITLE_TCAT' AND OWNER = 'CR';
- 若
DOMIDX_STATUS为INVALID,执行同步或重建:
-- 同步索引 EXEC CTX_DDL.SYNC_INDEX('CR.LACT_TITLE_TCAT'); -- 同步无效则重建索引 ALTER INDEX CR.LACT_TITLE_TCAT REBUILD;
4. 确认用户权限
执行查询的用户需要拥有CTXAPP角色,或直接授予Oracle Text相关权限:
GRANT CTXAPP TO <你的查询用户>;
5. 检查Oracle Text组件状态
若以上步骤均无效,确认生产库的Oracle Text组件是否正常:
SELECT COMP_NAME, STATUS FROM DBA_REGISTRY WHERE COMP_NAME LIKE 'Oracle Text%';
若状态不是VALID,需联系DBA修复或重新安装组件。
内容的提问来源于stack exchange,提问作者Oktam Yaqubov
相关产品推荐
相关产品推荐

