欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

[置顶] ORACLE编程的套路字符串分解

程序员文章站 2022-05-10 14:40:54
...

作 者按,字符串分解在ORACLE编程中可用于词、字的解析,继而可实现单词搜索的合并,为基础代码。 代码如下,作者保留所有权。 create or replace function FUN_STRING_SPLIT ( v_string IN VARCHAR2, v_sep IN VARCHAR2) return fs.stringList IS/*********

者按,字符串分解在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  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及以上版本。