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

相关文章

来自专栏WebDeveloper

Mysql数据库应用(一)

1042
来自专栏nodejs后端

nodejs 封装mysql

以上是在线运行项目,特意分享,网上大多都是2015年的文章,且没有新的方法,可以查看官方文档 mysql - npm

2737
来自专栏Hadoop数据仓库

Oracle 多主(Master Replication)复制配置

一、环境 windows server 2003 sp1;10g 10.1.0.2 主体定义站点:SID:db1 IP:10.1.8.201 主体站点:SID:...

18710
来自专栏数据和云

走在专家的路上,每天一条SQL优化(3)

小编寄语:本系列分享的SQL优化实例,并不一定适用于所有相似SQL或所有场景。我们只是介绍一种方法,当你再次遇到类似SQL,可以根据真实场景,选择最适合的方案。...

2587
来自专栏Clive的技术分享

MySQL ORDER BY主键id加LIMIT限制走错索引

3313
来自专栏数据和云

实战演练:通过伪列、虚拟列实现SQL优化

本文是技术同仁 蔡亮 在日常工作中通过试验,总结出的一些技巧方案,供大家参考学习。在此,感谢蔡亮的供稿分享,希望大家也可以后续将学习工作中遇到的问题,解决方法分...

913
来自专栏乐沙弥的世界

Oracle RAC 服务器端连接负载均衡(Load Balance)

        Oracle RAC服务器端的负载均衡是根据RAC中各节点的连接负荷数情况,将新的连接请求分配到负荷最小的节点上去。当数据库处于运行时,RAC中...

1462
来自专栏文渊之博

mysql replace into 的使用情况

 发现,auto_increment并没有+1,而是针对原来的那一条id=4的记录进行了update,因为没有指定其他列(v,extra)的值,所以,updat...

493
来自专栏乐沙弥的世界

跨NAT,防火墙(firewall)的RAC监听配置(ORA-12545)

    对于存在NAT或防火墙的RAC数据库,在启用了服务器端的load balance后,经常会碰到ORA-12545连接错误,这是因为服务器端转发客户端连接...

533
来自专栏大大的微笑

关于在数据库中分页的问题,此处以sqlServer为例

--sqlserver :数据库分页 --int pageSize//每页多少条数据 --int pageNow=1 //当前页,默认为1 --假如每页为...

1829

扫码关注云+社区