我在执行此查询时遇到问题。
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
contains
感谢您的任何建议
PS与我之前的问题有关:Oracle DBMS_LOB.INSTR和CONTAINS性能
更新
重新创建索引并进行一些操作后,我发现我可以执行上面的查询,但是它不会返回任何内容。
如果尝试使用CONTAINS(gob_a_document, '%'),结果将是26行,并且不知道查询是通过哪个键选择它们的(至少我没有发现明显的地方,我将对其进行更多调查)。问题可能在于我们正在使用Oracle 10g并存储版本11支持的DOCX文件。
CONTAINS(gob_a_document, '%')
“索引的运行状态为失败”
好的,这意味着您的CREATE INDEX语句失败。您收到错误消息了吗?我想答案是肯定的,但您错过了。因此,您需要做的是:
如果不是很明显,则另一个语句将运行,因为它没有尝试使用您的CONTEXT索引。它很难进行搜索。
“事实是该索引已经在数据库中创建了,”
没有真正的事情是索引 无法 正确 创建 ,因此它的状态是正确的。您可能只是重建了索引,但是通常最好先修复故障的根本原因。因此,我建议您删除并重新创建。显然,最初的故障是由于某些环境条件而不再适用。
“现在查询已执行,但是它没有给我任何结果(返回了0行)。(而且我确信它应该像100行一样返回)”
这样听起来就好像您是以二进制格式存储文档一样。什么样的文件?它们是受支持的格式吗?这将取决于您所使用的Oracle版本。例如, Oracle Text 10g最多支持Word 2003(即,仅DOC),而Oracle Text 11g支持Word 2007(即,也为DOCX)。