作者按,字符串分解在ORACLE编程中可用于词、字的解析,继而可实现单词搜索的合并,为基础代码。
代码如下,作者保留所有权。
create or replace function FUN_STRING_SPLIT (
v_string IN VARCHAR2,
v_sep IN VARCHAR2)
return fs.stringList IS
/***************************************************************************/
/* */
/* 字符串分割函数 for ORACLE */
/* @param v_string 母字符串 */
/* @param v_sep 分隔符 */
/* @return 字符串列表 */
/* TYPE stringList IS TABLE OF VARCHAR2(256) INDEX BY BINARY_INTEGER; */
/* @author foolstudio@qq.com */
/* All rights reserved. 未经许可,不得用于商业用途 */
/* */
/***************************************************************************/
--分隔符长度
C_LEN int;
--删除空格后的字符串
v_str varchar2(256);
--分隔符位置
v_pos int;
--子字符串
v_sub varchar2(256);
--数组计数器
v_i int;
--结果
Result fs.stringList;
BEGIN
v_str := TRIM(v_string);
--dbms_output.put_line(v_str);
v_pos := INSTR(v_str, v_sep);
v_i := 0;
C_LEN := LENGTH(v_sep);
--无匹配,整字符串返回
IF v_pos < 1 AND LENGTH(v_str) > 0 THEN
Result(v_i) := v_str;
return Result;
END IF;
WHILE v_pos > 0 LOOP
v_sub := SUBSTR(v_str, 0, v_pos-1);
--添加到结果数组
IF LENGTH(v_sub) > 0 THEN
Result(v_i) := v_sub;
v_i := v_i+1;
END IF;
--dbms_output.put_line(v_sub);
v_str := SUBSTR(v_str, v_pos+C_LEN);
--dbms_output.put_line(v_str);
v_pos := INSTR(v_str, v_sep);
END LOOP;
--已无匹配,剩余字符串添加到结果数组
IF LENGTH(v_str) > 0 THEN
Result(v_i) := v_str;
END IF;
--调试输出结果
dbms_output.put_line('列表项数量: '||result.count() );
dbms_output.put_line('--['||v_string||'] split by ['||v_sep||']--');
v_i := 0;
FOR v_i IN 0..(result.count()-1) LOOP
dbms_output.put_line('('||v_i||'): '||result(v_i) );
end loop;
--返回结果数组
return Result;
END FUN_STRING_SPLIT;
代码注释相当详细,不再对代码进行解释。
经测试,代码支持ORACLE 10及以上版本。