在PLSQL中实现分割字符串

来源:互联网 发布:sql 相同id 合并字段 编辑:程序博客网 时间:2024/06/17 04:23

首先在SQL窗口创建table类型变量,用来声明函数返回的数组类型:

/*变量类型声明*/CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);

/*函数*/CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)    RETURN ty_str_split    IS    j INT := 0;    i INT := 1;    len INT := 0;    len1 INT := 0;    str VARCHAR2 (4000);    str_split ty_str_split := ty_str_split ();    BEGIN      len := LENGTH (p_str);      len1 := LENGTH (p_delimiter);       WHILE j < len        LOOP          j := INSTR (p_str, p_delimiter, i);   /*INSTR(x, find_string [, start] [, occurrence]);搜索find_string在x中并返回它出现的位置*//*如果String2在String1中没有找到,instr函数返回0*/       IF j = 0  THEN              j := len;              /*j等于待分割的字符串最后一个位置*/            str := SUBSTR (p_str, i);                /*str等于将待分割字符串从i位置分割到结束位置*/    /*添加到数组*/            str_split.EXTEND;              str_split (str_split.COUNT) := str;               /*数组.count可以获取到数组实际长度*/    /*i代表待分割的字符串开始分割的位置,len代表待分割字符串长度或结束位置,如果待分割的字符串开始分割的位置>=待分割字符串长度或结束位置则分割结束,退出循环*/            IF i >= len              THEN                EXIT;              END IF;          ELSE              str := SUBSTR (p_str, i, j - i);      /*SUBSTR(x, start [, length]); 返回x的一个子开始于由start指定的位置。可选长度为子字符串*/    /*i变成j+分割符长度的位置*/            i := j + len1;      /*添加到数组*/            str_split.EXTEND;              str_split (str_split.COUNT) := str;          END IF;        END LOOP;            RETURN str_split;  END fn_split;

测试代码:

/*测试代码*/declare  -- Non-scalar parameters require additional processing   s ty_str_split;  len INTEGER;begin  -- Call the function  s := fn_split('1,2,3',',');  len :=s.count;  dbms_output.put_line('数组长度:'||len);  FOR i IN 1..len     LOOP      dbms_output.put_line(s(i));    END LOOP;  end;

输出:


参考易百教程