CONTAINS不适用于Oracle Text

时间:2012-03-02 09:51:51

标签: sql oracle oracle-sqldeveloper oracle-text

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

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中查看Table属性中的Edit Table时,我可以看到索引的Operational Status是FAILED。有谁知道这是什么意思?也许数据库权利?

当我使用

时,它也正常工作
dbms_lob.instr(gob_a_document, utl_raw.cast_to_raw('java')) > 0

而不是contains

感谢您的任何建议

P.S。这与我上一个问题Oracle DBMS_LOB.INSTR and CONTAINS performance

有关

更新

在重新创建索引和一些游戏后,我发现我可以执行上面的查询,但它不会返回任何东西。

如果我使用CONTAINS(gob_a_document, '%')进行尝试,结果是26行,并且不知道查询选择了哪个键(至少我没有找到任何明显的,我会更多地研究它)。问题可能在于我们使用的是Oracle 10g并存储了版本11支持的DOCX文件。

1 个答案:

答案 0 :(得分:4)

  

"指数的运作状态为FAILED"

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

  • 删除索引
  • 重新运行CREATE INDEX语句
  • 如果它抛出错误,请记下原因并修复它

如果不明显,另一个语句会运行,因为它没有尝试使用您的CONTEXT索引。它正在艰难地进行搜索。


  

"事情是索引已经在DB中创建,"

索引无法正确创建,因此其状态是真实的。您可以重建索引,但通常最好先修复失败的根本原因。这就是我建议你放弃并重新创建的原因。显然,最初的失败是由于一些不再适用的环境条件造成的。


  

"现在执行查询,但它没有给我任何结果(0行   回)。 (我确信它应该返回100行)"

这听起来像是以二进制格式存储文档。什么样的文件?它们是否支持格式?这取决于您使用的Oracle版本。例如,Oracle Text 10g supports up t Word 2003 (i.e. DOC only)Oracle Text 11g supports Word 2007 (i.e. DOCX as well)