oracle 关键字split,Oracle实现split和splitstr函数

/*

* Oracle 创建 split 和 splitstr 函数

*/

/* 创建一个表类型 */

create or replace type tabletype as table of VARCHAR2(32676)

/

/* 创建 split 函数 */

CREATE OR REPLACE FUNCTION split (p_list CLOB, p_sep VARCHAR2 := ',')

RETURN tabletype

PIPELINED

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

* Name: split

* Author: Sean Zhang.

* Date: 2012-09-03.

* Function: 返回字符串被指定字符分割后的表类型。

* Parameters: p_list: 待分割的字符串。

p_sep: 分隔符,默认逗号,也可以指定字符或字符串。

* Example: SELECT *

FROM users

WHERE u_id IN (SELECT COLUMN_VALUE

FROM table (split ('1,2')))

返回u_id为1和2的两行数据。

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

IS

l_idx PLS_INTEGER;

v_list VARCHAR2 (32676) := p_list;

BEGIN

LOOP

l_idx := INSTR (v_list, p_sep);

IF l_idx > 0

THEN

PIPE ROW (SUBSTR (v_list, 1, l_idx - 1));

v_list := SUBSTR (v_list, l_idx + LENGTH (p_sep));

ELSE

PIPE ROW (v_list);

EXIT;

END IF;

END LOOP;

END;

/

/* 创建 splitstr 函数 */

CREATE OR REPLACE FUNCTION splitstr (str IN CLOB,

i IN NUMBER := 0,

sep IN VARCHAR2 := ','

)

RETURN VARCHAR2

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

* Name: splitstr

* Author: Sean Zhang.

* Date: 2012-09-03.

* Function: 返回字符串被指定字符分割后的指定节点字符串。

* Parameters: str: 待分割的字符串。

i: 返回第几个节点。当i为0返回str中的所有字符,当i 超过可被分割的个数时返回空。

sep: 分隔符,默认逗号,也可以指定字符或字符串。当指定的分隔符不存在于str中时返回sep中的字符。

* Example: select splitstr('abc,def', 1) as str from dual; 得到 abc

select splitstr('abc,def', 3) as str from dual; 得到 空

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

IS

t_i NUMBER;

t_count NUMBER;

t_str VARCHAR2 (4000);

BEGIN

IF i = 0

THEN

t_str := str;

ELSIF INSTR (str, sep) = 0

THEN

t_str := sep;

ELSE

SELECT COUNT ( * )

INTO t_count

FROM table (split (str, sep));

IF i <= t_count

THEN

SELECT str

INTO t_str

FROM (SELECT ROWNUM AS item, COLUMN_VALUE AS str

FROM table (split (str, sep)))

WHERE item = i;

END IF;

END IF;

RETURN t_str;

END;

/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值