使用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

相关文章

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

MySQL错误代码2058和2059的解决办法

《MySQL错误代码2058和2059的解决办法》:本文主要介绍MySQL错误代码2058和2059的解决办法,2058和2059的错误码核心都是你用的客户端工具和mysql版本的密码插件不匹配,... 目录1. 前置理解2.报错现象3.解决办法(敲重点!!!)1. php前置理解2058和2059的错误

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE