Oracle 自定义split 函数

Oracle没有提供split函数,但可以自己建立一个函数实现此功能。比如“abc defg  hijkl   nmopqr     stuvw  xyz”,分隔符是空格,但空格个数不定。 源代码:

CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
CREATE OR REPLACE FUNCTION fn_var_split (
    p_str IN VARCHAR2,
    p_delimiter IN VARCHAR2
)
 RETURN ty_str_split
IS
    j INT := 0;
 len INT := 0;
 str VARCHAR2 (4000);
    str_split ty_str_split := ty_str_split ();
    v_str VARCHAR2 (4000) := RTRIM (LTRIM (p_str, p_delimiter), p_delimiter);
BEGIN
 len := LENGTH (v_str);
 WHILE len > 0
    LOOP
        j := INSTR (v_str, p_delimiter, 1);
 IF j = 0
 THEN
 str := SUBSTR (v_str, 1);
 len := 0;
            str_split.EXTEND;
            str_split (str_split.COUNT) := str;
 ELSE
 str := SUBSTR (v_str, 1, j - 1);
            v_str := LTRIM (LTRIM (v_str, str), p_delimiter);
 len := LENGTH (v_str);
            str_split.EXTEND;
            str_split (str_split.COUNT) := str;
 END IF;
 END LOOP;
 RETURN str_split;
END fn_var_split;
/

测试 结果: 1 12 123 1234 12345

DECLARE
 CURSOR c
 IS
 SELECT * FROM TABLE (CAST (fn_var_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;
/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据分析

[数据库基础]——快速浏览日期时间转换

阅读导航 数据库日期和时间类型 相互转换     time ⇌ date time ⇌ smalldatetime time ⇌ datetime tim...

2646
来自专栏james大数据架构

通用分页存储过程

/*通用分页存储过程*/ USE HotelManagementSystem GO IF EXISTS(SELECT * FROM sys.objects WH...

1918
来自专栏杨建荣的学习笔记

通过pl/sql来格式化sql(r4笔记第63天)

在之前的一篇博文中分享了通过java来格式化sql,http://blog.itpub.net/23718752/viewspace-1444910/ 今天突然...

3184
来自专栏王硕

原 通过连接libpq对PostgreSQL操作的例子

3898
来自专栏向治洪

Android ormLite复杂条件查询

OrmLite要继承一个OrmLiteSqliteOpenHelper,通过OrmLiteSqliteOpenHelper实例的getDao方法可以获取一个Da...

1948
来自专栏数据库新发现

字符集问题的初步探讨(三)

http://www.eygle.com/special/NLS_CHARACTER_SET_03.htm

542
来自专栏杨建荣的学习笔记

关于reset sequence(r3笔记第85天)

sequence在工作中使用比较频繁,对于Insert中插入的值,如果只需要它能够自动递增,这个时候sequence就派上用场了。 但是既然sequence的值...

2788
来自专栏乐沙弥的世界

批量 SQL 之 FORALL 语句

    对PL/SQL而言,任何的PL/SQL块或者子程序都是PL/SQL引擎来处理,而其中包含的SQL语句则由PL/SQL引擎发送SQL语句转交到SQL引擎...

632
来自专栏行者常至

pgsql编写触发器

540
来自专栏跟着阿笨一起玩NET

SQL中存储过程中使用事务,并且加入异常处理机制.

322

扫码关注云+社区