使用Oracle的PL/SQL编写自定义函数来实现split

2024-08-25 14:28

本文主要是介绍使用Oracle的PL/SQL编写自定义函数来实现split,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Oracle数据库没有内置的split函数,但是你可以使用Oracle的PL/SQL编写自定义函数来实现类似的功能。以下是一个例子,展示了如何创建一个split函数,它将字符串按照指定的分隔符进行拆分,并返回一个PL/SQL表类型。

1、创建fn_split函数

1.1、创建或替换一个名为tabletype的一个表类型

create or replace type tabletype as table of varchar2(32676);
/

1.2、fn_split函数

create or replace function fn_split (p_list clob, p_sep varchar2 := ',')return tabletype pipelined
isl_idx    pls_integer;v_list  varchar2 (32676) := p_list;
beginloopl_idx  := instr (v_list, p_sep);if l_idx > 0thenpipe row (substr (v_list, 1, l_idx - 1));v_list  := substr (v_list, l_idx + length (p_sep));elsepipe row (v_list);exit;end if;end loop;
end;
/

2、调用fn_split函数

2.1、指定字符串调用

HR@PROD1> select * from table(fn_split('oracle11g,oracle12c,oracle19c',','));COLUMN_VALUE
--------------------------------------------------------------------------------
oracle11g
oracle12c
oracle19c

2.2、指定表字段关联调用

CREATE TABLE T_DBATest(   id INT PRIMARY KEY,c_name VARCHAR2(128) NOT NULL,c_description VARCHAR2(100) NOT NULL);INSERT INTO T_DBATest VALUES (1, 'DEV001','SGCIT-Oracle');
INSERT INTO T_DBATest VALUES (2, 'DEV002','SQLServer-MongoDB-PostgreSQL');
INSERT INTO T_DBATest VALUES (4, 'DEV003','InfluxDB-MySQL-SAPHANA');
INSERT INTO T_DBATest VALUES (5, 'DEV004','JAVA-ABAP-C++');
commit;

支持Oracle11g/Oracle12c(12.1/12.2)/Oracle19c环境中调用

HR@PROD1> SELECT * FROM T_DBATest T1 CROSS JOIN table (fn_split (T1.C_DESCRIPTION,'-'));ID C_NAME               C_DESCRIPTION                            COLUMN_VALUE
----- -------------------- ---------------------------------------- ----------------------------------------1 DEV001               SGCIT-Oracle                             SGCIT1 DEV001               SGCIT-Oracle                             Oracle2 DEV002               SQLServer-MongoDB-PostgreSQL             SQLServer2 DEV002               SQLServer-MongoDB-PostgreSQL             MongoDB2 DEV002               SQLServer-MongoDB-PostgreSQL             PostgreSQL4 DEV003               InfluxDB-MySQL-SAPHANA                   InfluxDB4 DEV003               InfluxDB-MySQL-SAPHANA                   MySQL4 DEV003               InfluxDB-MySQL-SAPHANA                   SAPHANA5 DEV004               JAVA-ABAP-C++                            JAVA5 DEV004               JAVA-ABAP-C++                            ABAP5 DEV004               JAVA-ABAP-C++                            C++11 rows selected.

支持Oracle12c(12.2)/Oracle19c 调用

Oracle 12c(12.1) 新增了 CROSS APPLY TABLE 和 OUTER APPLY TABLE 子句,它们用于表值函数(TVF)的 lateral 查询。CROSS APPLY 用于交叉联接,而 OUTER APPLY 用于外部联接。
以下是一个简单的例子,使用 CROSS APPLY TABLE 来展示如何将表值函数的结果与原始表结合起来

HR@ORCL> col id format 9999
HR@ORCL> col c_name format a20
HR@ORCL> col C_DESCRIPTION format a40
HR@ORCL> col COLUMN_VALUE format a40
HR@ORCL> set linesize 200
HR@ORCL> SELECT * FROM T_DBATest T1 CROSS JOIN (fn_split (T1.C_DESCRIPTION,'-'));ID C_NAME               C_DESCRIPTION                            COLUMN_VALUE
----- -------------------- ---------------------------------------- ----------------------------------------1 DEV001               SGCIT-Oracle                             SGCIT1 DEV001               SGCIT-Oracle                             Oracle2 DEV002               SQLServer-MongoDB-PostgreSQL             SQLServer2 DEV002               SQLServer-MongoDB-PostgreSQL             MongoDB2 DEV002               SQLServer-MongoDB-PostgreSQL             PostgreSQL4 DEV003               InfluxDB-MySQL-SAPHANA                   InfluxDB4 DEV003               InfluxDB-MySQL-SAPHANA                   MySQL4 DEV003               InfluxDB-MySQL-SAPHANA                   SAPHANA5 DEV004               JAVA-ABAP-C++                            JAVA5 DEV004               JAVA-ABAP-C++                            ABAP5 DEV004               JAVA-ABAP-C++                            C++11 rows selected.
-- 以上 CROSS JOIN 在12c开始关联表值函数时,可以不明确指定 table 关键字HR@ORCL> SELECT * FROM T_DBATest T1 CROSS JOIN (fn_split (T1.C_DESCRIPTION,'-'));ID C_NAME               C_DESCRIPTION                            COLUMN_VALUE
----- -------------------- ---------------------------------------- ----------------------------------------1 DEV001               SGCIT-Oracle                             SGCIT1 DEV001               SGCIT-Oracle                             Oracle2 DEV002               SQLServer-MongoDB-PostgreSQL             SQLServer2 DEV002               SQLServer-MongoDB-PostgreSQL             MongoDB2 DEV002               SQLServer-MongoDB-PostgreSQL             PostgreSQL4 DEV003               InfluxDB-MySQL-SAPHANA                   InfluxDB4 DEV003               InfluxDB-MySQL-SAPHANA                   MySQL4 DEV003               InfluxDB-MySQL-SAPHANA                   SAPHANA5 DEV004               JAVA-ABAP-C++                            JAVA5 DEV004               JAVA-ABAP-C++                            ABAP5 DEV004               JAVA-ABAP-C++                            C++11 rows selected.HR@ORCL> SELECT * FROM T_DBATest T1 OUTER APPLY table (fn_split (T1.C_DESCRIPTION,'-'));ID C_NAME               C_DESCRIPTION                            COLUMN_VALUE
----- -------------------- ---------------------------------------- ----------------------------------------1 DEV001               SGCIT-Oracle                             SGCIT1 DEV001               SGCIT-Oracle                             Oracle2 DEV002               SQLServer-MongoDB-PostgreSQL             SQLServer2 DEV002               SQLServer-MongoDB-PostgreSQL             MongoDB2 DEV002               SQLServer-MongoDB-PostgreSQL             PostgreSQL4 DEV003               InfluxDB-MySQL-SAPHANA                   InfluxDB4 DEV003               InfluxDB-MySQL-SAPHANA                   MySQL4 DEV003               InfluxDB-MySQL-SAPHANA                   SAPHANA5 DEV004               JAVA-ABAP-C++                            JAVA5 DEV004               JAVA-ABAP-C++                            ABAP5 DEV004               JAVA-ABAP-C++                            C++11 rows selected.

Oracle 12c(12.2) 新增了 CROSS APPLY 和 OUTER APPLY 子句,它们用于表值函数(TVF)的 lateral 查询。CROSS APPLY 用于交叉联接,而 OUTER APPLY 用于外部联接。

关联表值函数时,可以不明确指定 table 关键字

以下是一个简单的例子,使用 CROSS APPLY 来展示如何将表值函数的结果与原始表结合起来

HR@ORCL> SELECT * FROM T_DBATest T1 CROSS APPLY (fn_split (T1.C_DESCRIPTION,'-'));ID C_NAME               C_DESCRIPTION                            COLUMN_VALUE
----- -------------------- ---------------------------------------- ----------------------------------------1 DEV001               SGCIT-Oracle                             SGCIT1 DEV001               SGCIT-Oracle                             Oracle2 DEV002               SQLServer-MongoDB-PostgreSQL             SQLServer2 DEV002               SQLServer-MongoDB-PostgreSQL             MongoDB2 DEV002               SQLServer-MongoDB-PostgreSQL             PostgreSQL4 DEV003               InfluxDB-MySQL-SAPHANA                   InfluxDB4 DEV003               InfluxDB-MySQL-SAPHANA                   MySQL4 DEV003               InfluxDB-MySQL-SAPHANA                   SAPHANA5 DEV004               JAVA-ABAP-C++                            JAVA5 DEV004               JAVA-ABAP-C++                            ABAP5 DEV004               JAVA-ABAP-C++                            C++11 rows selected.HR@ORCL> SELECT * FROM T_DBATest T1 OUTER APPLY (fn_split (T1.C_DESCRIPTION,'-'));ID C_NAME               C_DESCRIPTION                            COLUMN_VALUE
----- -------------------- ---------------------------------------- ----------------------------------------1 DEV001               SGCIT-Oracle                             SGCIT1 DEV001               SGCIT-Oracle                             Oracle2 DEV002               SQLServer-MongoDB-PostgreSQL             SQLServer2 DEV002               SQLServer-MongoDB-PostgreSQL             MongoDB2 DEV002               SQLServer-MongoDB-PostgreSQL             PostgreSQL4 DEV003               InfluxDB-MySQL-SAPHANA                   InfluxDB4 DEV003               InfluxDB-MySQL-SAPHANA                   MySQL4 DEV003               InfluxDB-MySQL-SAPHANA                   SAPHANA5 DEV004               JAVA-ABAP-C++                            JAVA5 DEV004               JAVA-ABAP-C++                            ABAP5 DEV004               JAVA-ABAP-C++                            C++11 rows selected.

支持Oracle12c(12.2)/Oracle19c 调用
Lateral View是Oracle 12c中的一个新特性,它允许你从一个表达式生成的集合中为每个元素应用一个查询。这是一个非常强大的特性,可以用来分析数组、集合、列表或者多维数组等复杂的数据结构。

-- oracle12c (12.2)/oracle19c
col id format 9999
col c_name format a20
col C_DESCRIPTION format a40
col COLUMN_VALUE format a40
set linesize 200
SELECT * FROM T_DBATest T1 ,lateral (SELECT * FROM fn_split (T1.C_DESCRIPTION,'-'));HR@orcl> SELECT * FROM T_DBATest T1 ,lateral (SELECT * FROM fn_split (T1.C_DESCRIPTION,'-'));ID C_NAME               C_DESCRIPTION                            COLUMN_VALUE
----- -------------------- ---------------------------------------- ----------------------------------------1 DEV001               SGCIT-Oracle                             SGCIT1 DEV001               SGCIT-Oracle                             Oracle2 DEV002               SQLServer-MongoDB-PostgreSQL             SQLServer2 DEV002               SQLServer-MongoDB-PostgreSQL             MongoDB2 DEV002               SQLServer-MongoDB-PostgreSQL             PostgreSQL4 DEV003               InfluxDB-MySQL-SAPHANA                   InfluxDB4 DEV003               InfluxDB-MySQL-SAPHANA                   MySQL4 DEV003               InfluxDB-MySQL-SAPHANA                   SAPHANA5 DEV004               JAVA-ABAP-C++                            JAVA5 DEV004               JAVA-ABAP-C++                            ABAP5 DEV004               JAVA-ABAP-C++                            C++11 rows selected.-- oracle12c (12.2)/oracle19c
SELECT * FROM T_DBATest T1 left join lateral (SELECT * FROM fn_split (T1.C_DESCRIPTION,'-')) T2 on 1=1;HR@orcl> SELECT * FROM T_DBATest T1 left join lateral (SELECT * FROM fn_split (T1.C_DESCRIPTION,'-')) T2 on 1=1;ID C_NAME               C_DESCRIPTION                            COLUMN_VALUE
----- -------------------- ---------------------------------------- ----------------------------------------1 DEV001               SGCIT-Oracle                             SGCIT1 DEV001               SGCIT-Oracle                             Oracle2 DEV002               SQLServer-MongoDB-PostgreSQL             SQLServer2 DEV002               SQLServer-MongoDB-PostgreSQL             MongoDB2 DEV002               SQLServer-MongoDB-PostgreSQL             PostgreSQL4 DEV003               InfluxDB-MySQL-SAPHANA                   InfluxDB4 DEV003               InfluxDB-MySQL-SAPHANA                   MySQL4 DEV003               InfluxDB-MySQL-SAPHANA                   SAPHANA5 DEV004               JAVA-ABAP-C++                            JAVA5 DEV004               JAVA-ABAP-C++                            ABAP5 DEV004               JAVA-ABAP-C++                            C++11 rows selected.

这篇关于使用Oracle的PL/SQL编写自定义函数来实现split的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105803

相关文章

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局