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 条评论
登录 后参与评论

相关文章

来自专栏后端之路

MySql优化器的bug?

背景 最近系统上了一个大客户 该客户反馈系统使用很慢,部分页面出现需要花到20s SELECT id_car idCar, i...

2736
来自专栏james大数据架构

通用分页存储过程

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

2078
来自专栏乐沙弥的世界

PL/SQL --> 流程控制

类似于高级语言,流程控制语句是PL/SQL语言的重要组成部分。这些流程控制语句使得PL/SQL加大了代码的灵活性和多样性,大大简化了

763
来自专栏AhDung

【SQL】找出行数与自增标识值不相等的表(即有缺行)

原理:遍历所有含自增列的用户表,用sp_spaceused过程分别获取每张表的行数并写入临时表,然后使用IDENT_CURRENT函数获取表的最大标识值,比较二...

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

SQL拆分多规则的字符串分离数字。

371
来自专栏Java成神之路

Oracle学习笔记_10_判断是否为日期类型

754
来自专栏Jerry的SAP技术分享

面试问题 - 只用位操作在ABAP里实现a+b

算法描述参考我的SCN博客 Just for fun – Implement a + b using pure bitwise operation in ABA...

3865
来自专栏数据分析

SQL Server 性能优化之——重复索引

1. 概述 很多人都知道索引在数据库上的是有利有弊的。像其他主流商业数据库一样SQL Server允许在一个列上重复创建索引。因为SQL Server没有限制创...

2919
来自专栏c#开发者

获取数据字典

 表结构信息查询 SELECT      TableName=CASE WHEN C.column_id= THEN O.name ELSE N'' END,...

3705
来自专栏面朝大海春暖花开

mysql树形结构递归查询

之前一直用的是Oracle,对于树形查询可以使用start with ... connect by 

2524

扫码关注云+社区