4000个字符的限制不是一些任意边界:它是Oracle SQL可以处理的VARCHAR2字符的最大数量。
4000个字符是很多的文字。英文大约有600个单词,或者是一个A4页面,还有一点是合理的点字体。我能想到的并不是很多应用程序需要搜索这么大的文件。即使大学检查学生的剽窃文章,也不会超过段落级别。
但是,如果您确实遇到一种情况,即4000个字符的匹配字符会生成误报,您只需将查询字符串拆分为块并在其上进行搜索即可。这意味着你必须使用PL/SQL:
create or replace function big_search (p_search_text in varchar2)
return sys_refcursor
is
return_value sys_refcursor;
p_srch1 varchar2(4000);
p_srch2 varchar2(4000);
begin
dbms_output.put_line('search_length='||to_char(length(p_search_text)));
p_srch1 := substr(p_search_text, 1, 4000);
p_srch2 := substr(p_search_text, 4001, 4000);
open return_value for
select docname
, (score(1) + score(2))/2 as score
from t23
where contains (text_column, p_srch1 , 1) != 0
and contains (text_column, p_srch2 , 2) != 0;
return return_value;
end;
/
如果你不知道搜索文本的大小提前,那么你就需要使用动态SQL来组装这一点。请注意,将空搜索条件传递给CONTAINS()将投掷DRG-50901: text query parser syntax error
。
来源
2010-06-25 09:55:15
APC
一个VARCHAR2表列的极限是4000个字符,但在PL/SQL一个VARCHAR2变量的上限为32767个字符。您确定CONTAINS语句中的文本查询限制为4000而不是32767? – 2010-06-25 09:18:27
@MarkBaker - CONTAINS()是一个SQL函数,所以SQL限制适用。 – APC 2010-06-25 09:57:59
@APC谢谢澄清,我从来没有真正使用Oracle的文本索引,所以我不确定 – 2010-06-25 10:01:14