oracle 逗号分隔存储过程 函数 字符串分割

方法一:

create or replace type tab_split_list is table of varchar2(200);  --创建变量

/******************************************************************************

   --       工具类

           分割字符串 调用方法例如

            SELECT COLUMN_VALUE AS a FROM  TABLE(get_split_lists('25#1','#'));

   --     输入参数:

   --           i_date

   --     输出参数

   --       o_retCode    返回标志位

   --       totalNum     返回总条数

   -- REVISIONS:

   --    Ver           Date            Author                 Description

   -- ---------      ----------      ----------        --------------------------

   --   1.0         2015-04-21        jiajitao              create this procedure.

  ******************************************************************************/

  FUNCTION  get_split_lists(i_str varchar2,i_delimiter varchar2) RETURN tab_split_list IS

   v_list tab_split_list;

   begin

 

 

   SELECT  aa.s  BULK COLLECT INTO v_list FROM(

                SELECT REGEXP_SUBSTR(ONAME, '[^'||i_delimiter||']+', 1, ROWNUM) AS s

                  FROM (SELECT i_str AS ONAME FROM DUAL)

                CONNECT BY ROWNUM <=LENGTH(REGEXP_REPLACE(ONAME, '[^'||i_delimiter||']+')) + 1

   ) aa WHERE aa.s IS NOT NULL;

 

   RETURN v_list;

 END get_split_lists;

方法二

 

--创建变量
CREATE OR REPLACE TYPE "ARRYTYPE1" IS VARRAY(10000) OF VARCHAR(2000);

 

 

--创建函数

CREATE OR REPLACE FUNCTION FUNC_ISM_GETSPLITSTR (
in_str IN VARCHAR2, --需分割的字符串
in_split IN VARCHAR2 --分隔符
)
RETURN arrytype1
AS
v_count1 INTEGER;
v_count2 INTEGER;
v_strlist arrytype1;
v_node VARCHAR2 (2000);
BEGIN
v_count2 := 0;
v_strlist := arrytype1 ();

 

IF (in_str IS NULL) OR (LENGTH (in_str) <= 0)
THEN
RETURN NULL;
END IF;

 

FOR v_i IN 1 .. LENGTH (in_str)
LOOP
v_count1 := INSTRB (in_str, in_split, 1, v_i);
v_count2 := INSTRB (in_str, in_split, 1, v_i + 1);
v_node := SUBSTRB (in_str, v_count1 + 1, v_count2 - v_count1 - 1);

 

IF v_node IS NULL
THEN
v_node := '';
END IF;

 

IF (v_count2 = 0) OR (v_count2 IS NULL)
THEN
EXIT;
ELSE
v_strlist.EXTEND ();
v_strlist (v_i) := v_node;
v_node := '';
END IF;
END LOOP;

 

RETURN v_strlist;

 

END FUNC_ISM_GETSPLITSTR;

 

 

--测试

 

 


SELECT * FROM TABLE( FUNC_ISM_GETSPLITSTR('_FUNC_CTP_LG_GEsss_s_ssssTSPNG_', '_'));

 

转载于:https://www.cnblogs.com/jiajitao/p/6715647.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值