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树形结构递归查询

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

97440
来自专栏空间大数据可视化

T-SQL取时间的不同方法

9150
来自专栏数据分析

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

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

35390
来自专栏c#开发者

获取数据字典

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

38650
来自专栏乐沙弥的世界

PL/SQL --> 流程控制

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

9330
来自专栏AhDung

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

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

12720
来自专栏james大数据架构

通用分页存储过程

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

25580
来自专栏AhDung

【T-SQL】获取指定日期的常用前后节点(月初月末周一周末等等)

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

winfrom如何做一个语法着色控件

本文转载:http://www.cnblogs.com/hexin0614/archive/2012/01/17/2324224.html

7110
来自专栏Java成神之路

Oracle学习笔记_06_CASE WHEN 用法介绍

貌似只有Oracle提供该函数,而且不支持ANSI SQL,语法上也没CASE WHEN清晰,个人不推荐使用。

6410

扫码关注云+社区

领取腾讯云代金券