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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国产游戏技术能否引领全球

目录 1.概述 1.1.面临的挑战 1.2.机遇 1.3.IT技术创新如何推动行业发展 2.技术解析 2.1.图形渲染技术 2.2.物理引擎 2.3.人工智能 (AI) 3.行业影响 3.1.对国内游戏开发行业的影响 3.2.IT人才需求变化 3.3.技术发展方向 4.未来展望 4.1. 发展前景 4.2. IT技术人员…

分布式基础理论——CAP理论和BASE理论

文章目录 CAP 理论BASE 理论参考资料 CAP 理论 CAP定理(CAP theorem)指出,在分布式系统中,设计读写操作时只能同时满足以下三个特性中的两个: 一致性(Consistency) : 所有节点访问同一份最新的…

用于目标说话人提取的统一视听线索

第二章 目标说话人提取之《Unified Audio Visual Cues for Target Speaker Extraction 》 文章目录 前言一、任务二、动机三、挑战四、方法1.总体架构2.tes网络3. 融合网络4.损失函数 五、实验评价1.数据集2.消融实验3.客观评价4.主观评价 六、结论七、知识小结 前言 语音新手…

93.WEB渗透测试-信息收集-Google语法(7)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:92.WEB渗透测试-信息收集-Google语法(6) • intext • intext 的作…

[数据集][目标检测]电力场景输电线导线散股检测数据集VOC+YOLO格式3890张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3890 标注数量(xml文件个数):3890 标注数量(txt文件个数):3890 标注…

亲测好用,吐血整理 ChatGPT 3.5/4.0 新手使用手册~ 【2024年9月 更新】

废话不多说,直接分享正文~ 以下是小编为大家搜集到的最新的ChatGPT国内站,各有优缺点。 1、AI Plus(稳定使用) 推荐指数:⭐⭐⭐⭐⭐ yixiaai.com 该网站已经稳定运营了1年多了。2023年3月份第一批上线的网…

网络udp及ipc内存共享

大字符串找小字符串 调试 1. 信号处理函数注册:•一旦使用 signal 函数注册了信号处理函数,该函数就会一直有效,直到程序结束或者显式地取消注册。2. 注册多次的影响:•如果多次注册同一信号的处理函数,最后一次注册的…

PHP软件下载-安装-环境配置

.1.下载 下载地址如下 windows.php.net - /downloads/releases/ 安装包如下. .2.安装 可以在D盘或者E盘的根目录创建一个自定义目录。注意文件夹目录中不能包含中文,不能包含空格等特殊字符。 版本说明: (1)ts表示非线程安全版本。这个安装包还指明了…

Spring security 密码加密使用

一、密码加密 2011年12月21日,有人在网络上公开了一个包含600万个CSDN 用户资料的数据库,数据全部为明文储存,包含用户名、密码以及注册邮箱。事件发生后CSDN 在微博、官方网站等渠道发出了声明、解释说此数据库系2009 年备份所用&#xff0c…

Adobe After Effects的插件--------CC Ball Action

CC Ball Action是粒子效果器,其将2D图层变为一个个由3D小球构成的图层。它是AE内置的3D插件。 使用条件 使用该插件的图层需是2D图层。 我们以一张图片素材为例: 给图片图层添加CC Ball Action效果控件,然后新建一个摄像机(利用摄像机旋转、平移、推拉工具,方便在各个角…

OpenCV几何图像变换(6)计算反转仿射变换函数invertAffineTransform()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 反转一个仿射变换。 该函数计算由 23 矩阵 M 表示的逆仿射变换: [ a 11 a 12 b 1 a 21 a 22 b 2 ] \begin{bmatrix} a_{11} & a…

OpenCV绘图函数(2)绘制圆形函数circle()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 绘制一个圆。 cv::circle 函数用于绘制一个给定中心和半径的简单圆或填充圆。 函数原型 void cv::circle (InputOutputArray img,Point cen…

JS中【reduce】方法讲解

reduce 是 JavaScript 中用于数组操作的一个强大方法,它可以将数组中的所有元素通过指定的规则,归约为一个单一的值。这个方法非常灵活,可以用来执行累加、累乘、对象合并等多种复杂的数据处理任务。 reduce 方法的基本语法 array.reduce(c…

【JVM】垃圾回收算法(一)

垃圾回收算法 Java程序在运行过程中会产生大量的对象,但是内存大小是有限的,如果光用而不释放,那内存迟早被耗尽。如C/C程序,需要程序员手动释放内存,Java则不需要,是由垃圾回收期去自动回收。垃圾回收器回…

基于x86 平台opencv的图像采集和seetaface6的眼睛状态检测(睁眼,闭眼)功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.3 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的眼睛状态检测(睁眼,闭眼)功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的眼睛…

springboot项目中如何改变web服务的路径

背景: 之前是spring项目,增加了servlet,对应非访问路径如/defA/inner-invoke/operator。 现在改造成了springboot项目后,默认路径是/oprator 希望不改动原有controller代码,让路径能够增加前缀让外面能正常调用。 原…

挑选适合的项目协同软件?看看这10款

文章主要介绍了以下10款项目协同进度软件:1.PingCode;2.Worktile;3.万户OA;4.小步外勤;5.智办事;6.万里牛;7.轻流;8.Toggl Track;9.Trello;10.Todoist。 在如…

【markdown 中的文字颜色设置】按色系分类

文本颜色分类 蓝绿色系:灰色系:蓝紫色系:粉色系:绿色系:橘棕色系:语法,以天蓝色为例: <font color=skyblue>我是文字</font>我是文字 或者 替换成对应的16进制 <font color=#87CEEB>同理</font>同理 接下来是按色系分类的颜色名 蓝绿色系: …

PHP概述-特点-应用领域-如何学习

老师建议注册使用百度文心一言&#xff1b;讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞&#xff1b;Kimi.ai - 帮你看更大的世界 等人工智能工具软件的一个到两个&#xff0c;也可下载文心一言、讯飞星火、kimi等APP软件使用&#xff0c;对于我们在读的大二学生来说有什么…

哪款麦克风音质效果好?一文看懂无线领夹麦克风什么品牌好

说到无线领夹麦克风麦克风&#xff0c;可能有些朋友对这个名字感觉很陌生&#xff0c;但是对于自媒体创作者以及短视频up主而言&#xff0c;应该会更熟悉一些。因为一款好的麦克风是提升音质的关键&#xff0c;而无线领夹麦克风作为一种小巧方便的收音设备&#xff0c;近些年更…