oracle 实现 split 函数 (返回数组)

首先,这是最近在公司执行一个任务的时候遇到的情况,分享一下,代码来源于互联网,非原创。
 如果你的存储过程的参数个数不定,比如你要处理A条件、B条件2种情况,或者A条件、C条件、F条件的情况,
 每次的条件的个数和条件都是变动的,这样你的存储过程参数就不好做。这种情况下,你可以只输入一个参数,
 多个条件用特殊字符如逗号分隔,然后对这个条件截断拆分之后循环处理,类似于jquery的split方法。然而,oracle

并没有这样的函数,你需要自己编写,以下是收录的一个有用的将oracle字符串截断成数组(oracle复合数据类型)的function。


CREATE OR REPLACE PACKAGE StatisPackage
AS
    TYPE StatisList IS REF CURSOR;
    TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);  

    PROCEDURE Statis_Planning(PlanningId IN nvarchar2,SolutionID IN nvarchar2,indextypeid in NUMBER,cversionid IN nvarchar2,Indicators in nvarchar2,p_cur out StatisList);
    
    FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2) return ty_str_split;  
END StatisPackage;


CREATE OR REPLACE PACKAGE BODY StatisPackage AS
 
  /*****************************************************************************************************
  Description:实现 split 函数 (返回数组) 
  Param:uni_array:=f_split_string('aa,bb,cc,dd',',')
  Creator:               DATE:2015-12-13
  *****************************************************************************************************/
 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);  
  
    IF j = 0  
    THEN  
        j := len;  
        str := SUBSTR (p_str, i);  
        str_split.EXTEND;  
        str_split (str_split.COUNT) := str;  
  
        IF i >= len  
        THEN  
          EXIT;  
        END IF;  
    ELSE  
        str := SUBSTR (p_str, i, j - i);  
        i := j + len1;  
        str_split.EXTEND;  
        str_split (str_split.COUNT) := str;  
    END IF;  
  END LOOP;  
  
  RETURN str_split;  
END fn_split;  
end StatisPackage;

测试:

DECLARE
  CURSOR c
  IS
    SELECT *
      FROM TABLE (CAST (fn_split ('1;;12;;123;;1234;;12345', ';;') AS ty_str_split
                  )
              );

  r c%ROWTYPE;
BEGIN
  OPEN c;

  LOOP
    FETCH c INTO r;

    EXIT WHEN c%NOTFOUND;
    DBMS_OUTPUT.put_line (r.column_value);
  END LOOP;

  CLOSE c;
END;

 


结果:
1
12
123
1234
12345


方法二;

create or replace function f_split_string (var_str varchar2,var_split varchar2)
 return t_ret_table

is
 var_out t_ret_table; --定义变量
var_tmp varchar2(100);
 var_element varchar2(100);

begin
 var_tmp := var_str;
 var_out := t_ret_table();
--如果存在匹配的分割符
while instr(var_tmp,var_split)>0 loop
var_element:=substr(var_tmp,1,instr(var_tmp,var_split)-1);
 var_tmp := substr(var_tmp,instr(var_tmp,var_split)+length(var_split),length(var_tmp));
 var_out.extend(1);
 var_out(var_out.count) := var_element;
 end loop;
 var_out.extend(1);
 var_out(var_out.count) := var_tmp;
 return var_out;
 end f_split_string;

在代码里,uni_array是一个table of varchar2的数组,就可以uni_array:=f_split_string('aa,bb,cc,dd',',')
将aa、bb、cc、dd四个元素装入uni_array,然后循环处理。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值