Oracle文本catsearch多个在一个谓词中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle文本catsearch多个在一个谓词中相关的知识,希望对你有一定的参考价值。

我有一个包含2列varchar2类型的表。

我创建了2个索引

CREATE INDEX DOC_IDX_1 
ON DOCUMENTO 
( column1
) 
INDEX TYPE IS CTXSYS.CTXCAT
; 
CREATE INDEX DOC_IDX_2 
ON DOCUMENTO
( column2
) 
INDEX TYPE IS CTXSYS.CTXCAT
; 

当我执行查询

select * 
from   table1 
where  CATSEARCH(column1, 'AAA', NULL) > 0
AND    CATSEARCH(column2 , 'BBBb', NULL) > 0

我收到以下错误

ORA-20000: Oracle Text error:
DRG-10849: catsearch non supporta il richiamo funzionale
DRG-10599: la colonna non è indicizzata
20000. 00000 -  "%s"
*Cause:    The stored procedure 'raise_application_error'
       was called which causes this error to be generated.
*Action:   Correct the problem as described in the error message or contact
       the application administrator or DBA for more information.

英文翻译是:

$ oerr drg 10849
10849,0, "catsearch does not support functional invocation"
// *Cause: the query plan for your query is invoking a catsearch operator
//         functionally rather than as an index rowsource.  The catsearch
//         operator does not support functional invocation
// *Action: add optimizer hints so that all catsearch operators are
//          performed through index scans
// *Mnemonic: QE_CATSEARCH_FUNCINV
//

10599,0, "column is not indexed"
// *Cause: The column specified is not indexed.
// *Action: Create index on the column before performing this operation
// *Mnemonic: DL_COLUMN_NOT_INDEXED

我该如何解决这个问题?

谢谢

塞尔吉奥

答案

有关BarbaraBöhmer的评论,请参阅此known solution。否则,请指定带插入的复制方案;例如,您当前的SQL引用了Table1,但DDL适用于DOCUMENTO

另一答案

您做错了,首先,在ctxsys架构中,您应该以这种方式设置首选项:

begin
 ctx_ddl.create_preference('my_documents', 'MULTI_COLUMN_DATASTORE');
 ctx_ddl.set_attribute('my_documents', 'COLUMNS', 'column1, column2');
 ctx_ddl.create_preference('my_documents_lexer', 'BASIC_LEXER');  /* I strongly recommend you this preference*/
 ctx_ddl.set_attribute('my_documents_lexer', 'BASE_LETTER', 'YES');
end;
/

运行上面的脚本后,您就可以创建索引了:

create index DOC_IDX on DOCUMENTO(column1) indextype is ctxsys.context
parameters ('DATASTORE ctxsys.my_documents  section group CTXSYS.AUTO_SECTION_GROUP LEXER ctxsys.my_documents_lexer SYNC(on commit)');

您的查询可能会这样:

select * 
from documento
where contains(column1,'AAA WITHIN column1 AND BBBb WITHIN column2')>0

问候

丹尼尔

以上是关于Oracle文本catsearch多个在一个谓词中的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库的连接

为不同的表视图设置谓词

Oracle查询转换之连接谓词推入

Oracle统计信息不准(谓词越界)造成的性能问题

具有多个条件和一个参数的谓词

将 UITextField 中的文本用于 fetchRequest 谓词