一尘不染

CONTAINS不适用于Oracle Text

sql

我在执行此查询时遇到问题。

SELECT * FROM gob_attachment 
WHERE CONTAINS (gob_a_document, 'java') > 0

给我

ORA-29902: error in executing ODCIIndexStart() routine
ORA-20000: Oracle Text error: 
ORA-00942: table or view does not exist

29902. 00000 -  "error in executing ODCIIndexStart() routine"
*Cause:    The execution of ODCIIndexStart routine caused an error.
*Action:   Examine the error messages produced by the indextype code and
       take appropriate action.

经过一番谷歌搜索后,我发现问题可能出在索引上,但是当我查看表和索引时,对我来说似乎还可以。

创建索引脚本看起来像这样

CREATE INDEX FTSI_GOB_A_DOCUMENT 
 ON GOB_ATTACHMENT (GOB_A_DOCUMENT) 
 INDEXTYPE IS CTXSYS.CONTEXT;

唯一令我感到奇怪的是,当我在SQL
Developer中查看“表”属性中的“编辑表”时,可以看到索引的“操作状态”为FAILED。有谁知道这意味着什么?也许是数据库权利?

当我使用时它也能正常工作

dbms_lob.instr(gob_a_document, utl_raw.cast_to_raw('java')) > 0

代替 contains

感谢您的任何建议

PS与我之前的问题有关:Oracle
DBMS_LOB.INSTR和CONTAINS性能

更新

重新创建索引并进行一些操作后,我发现我可以执行上面的查询,但是它不会返回任何内容。

如果尝试使用CONTAINS(gob_a_document, '%'),结果将是26行,并且不知道查询是通过哪个键选择它们的(至少我没有发现明显的地方,我将对其进行更多调查)。问题可能在于我们正在使用Oracle
10g并存储版本11支持的DOCX文件。


阅读 204

收藏
2021-03-08

共1个答案

一尘不染

“索引的运行状态为失败”

好的,这意味着您的CREATE INDEX语句失败。您收到错误消息了吗?我想答案是肯定的,但您错过了。因此,您需要做的是:

  • 下降指数
  • 重新运行CREATE INDEX语句
  • 如果抛出错误,请记下原因并修复

如果不是很明显,则另一个语句将运行,因为它没有尝试使用您的CONTEXT索引。它很难进行搜索。


“事实是该索引已经在数据库中创建了,”

没有真正的事情是索引 无法 正确 创建
,因此它的状态是正确的。您可能只是重建了索引,但是通常最好先修复故障的根本原因。因此,我建议您删除并重新创建。显然,最初的故障是由于某些环境条件而不再适用。


“现在查询已执行,但是它没有给我任何结果(返回了0行)。(而且我确信它应该像100行一样返回)”

这样听起来就好像您是以二进制格式存储文档一样。什么样的文件?它们是受支持的格式吗?这将取决于您所使用的Oracle版本。例如, Oracle Text
10g最多支持Word
2003(即,仅DOC),
Oracle Text 11g支持Word
2007(即,也为DOCX)

2021-03-08