oracle中的分隔函数,Oracle中的split字符串分割函数

首先需要定义 2 个类型

1. Row 类型

CREATE OR REPLACE TYPE ty_row_str_split as object (strValue VARCHAR2 (4000))

2. Table 类型

CREATE OR REPLACE TYPE ty_tbl_str_split IS TABLE OF ty_row_str_split

创建函数:

CREATE OR REPLACE FUNCTION fn_split(p_str IN VARCHAR2,

p_delimiter IN VARCHAR2)

RETURN ty_tbl_str_split IS

j INT := 0;

i INT := 1;

len INT := 0;

len1 INT := 0;

str VARCHAR2(4000);

str_split ty_tbl_str_split := ty_tbl_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) := ty_row_str_split(strValue => 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) := ty_row_str_split(strValue => str);

END IF;

END LOOP;

RETURN str_split;

END fn_split;

使用样例:

select to_number(strvalue) as Value from table(fn_split('1,2,3',','))

select to_char(strvalue) as Value from table(fn_split('aa,bb,cc',','))

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

写function或procedure来分隔。

首先声明一个数组类型:

-- 字符串集合

TYPE Typ_Tab_Str IS TABLE OF VARCHAR(150) INDEX BY BINARY_INTEGER;

-- 写一个函数

CREATE OR REPLACE FUNCTION Fun_Stringtoarrary(P_Sourcestr IN VARCHAR2, -- 源字符串

P_Separator IN VARCHAR2, -- 分隔符

P_Arrary OUT Typ_Tab_Str -- 拆分后得到的数组

) RETURN NUMBER IS

n_Count NUMBER(6); -- 分隔符的个数

n_Posb NUMBER(6); -- 初始位置

n_Pose NUMBER(6); -- 分隔符的位置

BEGIN

-- 初始化

n_Count := 0;

n_Posb := 1;

-- 非空校验

IF Prm_Sourcestr IS NULL OR Prm_Separator IS NULL THEN

RETURN - 1;

END IF;

LOOP n_Pose := Instr(Prm_Sourcestr, Prm_Separator, n_Posb, 1);

n_Count := n_Count + 1;

IF n_Pose = 0 THEN

Prm_Arrary(n_Count) := Substr(Prm_Sourcestr, n_Posb, Length(Prm_Sourcestr) - n_Posb + 1);

EXIT;

END IF;

Prm_Arrary(n_Count) := Rtrim(Ltrim(Substr(Prm_Sourcestr, n_Posb, n_Pose - n_Posb))); n_Posb := n_Pose + Length(Prm_Separator);

END LOOP;

RETURN n_Count;

EXCEPTION

WHEN OTHERS THEN

RETURN - 1;

END Fun_Stringtoarrary;

备注:Oracle没有内置的split函数,只提供了,inner,substr等等简单操作的函数,因为oracle本身就没有数组类型,我们是通过索引表来模拟数组,其实就是一个仿数组的结构。上面的函数完全正确,属于常用自定义功能函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值