码迷,mamicode.com
首页 > 数据库 > 详细

Oracle使用split和splitstr函数批量分隔字符串

时间:2015-11-11 13:02:16      阅读:783      评论:0      收藏:0      [点我收藏+]

标签:

1.创建一个表类型

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

 

2.创建split  函数

CREATE OR REPLACE FUNCTION split (p_list CLOB, p_sep VARCHAR2 := ,)
RETURN tabletype
PIPELINED
IS
/* 
* 2015-11-11 
* Function: 返回字符串被指定字符分割后的表类型。
* Parameters: p_list: 待分割的字符串。
p_sep: 分隔符,默认逗号,也可以指定字符或字符串。 

*/

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; 
3.创建splitstr 函数
CREATE OR REPLACE FUNCTION splitstr (str IN CLOB,
i IN INT,
sep VARCHAR2 := ,)
RETURN VARCHAR2
/* 
* 2015-11-11
* Function: 返回字符串被指定字符分割后的指定节点字符串。
* Parameters: str: 待分割的字符串。
i: 返回第几个节点。当i为0返回str中的所有字符,当i 超过可被分割的个数时返回空。
sep: 分隔符,默认逗号,也可以指定字符或字符串。当指定的分隔符不存在于str中时返回sep中的字符。 
*/

IS
t_i NUMBER;
t_count NUMBER;
t_str VARCHAR2 (400);
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;

 

 

4.example 

select split(1,2) from dual;

select splitstr(abc,def, 2) as str from dual;

select * from table (split(1,2,,));

 

5.参考出处

http://www.cr173.com/html/18046_1.html

 

Oracle使用split和splitstr函数批量分隔字符串

标签:

原文地址:http://www.cnblogs.com/yimj/p/4955501.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!