给Oracle添加split和splitstr函数的方法

最近项目中有很多需要做批量操作的需求,客户端把一组逗号分隔的ID字符串传给数据库,存储过程就需要把它们分割,然后逐个处理

最近项目中有很多需要做批量操作的需求,客户端把一组逗号分隔的ID字符串传给数据库,存储过程就需要把它们分割,然后逐个处理。
以往的处理方式有如下几种:

1、在存储过程内写循环,逐个分析字符串中的ID,然后逐个处理。缺点:循环一次处理一个,如果每次判断都很多,效率将很受影响。适合每次处理要做单独判断的情况。

2、使用临时表,先调用一个存储过程将ID拆分并插入到临时表中,然后结合临时表可以写SQL一次处理多笔。缺点:需要插临时表,效率不高,数据量越大影响越严重。

以前的项目用的最多的还是第2中方式,毕竟方便,且效率比第1种好。
现在项目中用到了很多很多的批量操作,很多的重复代码让我不厌其烦。忽然想到,.Net和JS中都有split类似的函数,拆分字符串很方便,oracle中要是也有这样的功能该多好呀。

多方查找资料发现,给oracle添加split函数是完全可以实现的,避免了插入临时表,所以效率比上面的第2中方法效率高很多。

后来我还添加了splitstr函数,可以很方便获取字符串中的指定节点。
有了这两个函数,处理批量操作,真是如虎添翼,效率倍增,嘿嘿……
好了,闲话少说,上代码!如有不妥之处,请各位前辈博友斧正。
代码如下:
/*
* Oracle 创建 split 和 splitstr 函数
*/
/* 创建一个表类型 */
create or replace type tabletype as table of VARCHAR2(32676)
/
/* 创建 split 函数 */
CREATE OR REPLACE FUNCTION split (p_list CLOB, p_sep VARCHAR2 := ‘,’)
RETURN tabletype
PIPELINED
/**************************************
* Name: split
* Author: Sean Zhang.
* Date: 2012-09-03.
* Function: 返回字符串被指定字符分割后的表类型。
* Parameters: p_list: 待分割的字符串。
p_sep: 分隔符,默认逗号,也可以指定字符或字符串。
* Example: SELECT *
FROM users
WHERE u_id IN (SELECT COLUMN_VALUE
FROM table (split (‘1,2’)))
返回u_id为1和2的两行数据。
**************************************/
IS
l_idx PLS_INTEGER;
v_list VARCHAR2 (32676) := p_list;
BEGIN
LOOP
l_idx := INSTR (v_list, p_sep);
IF l_idx > 0
THEN
PIPE ROW (SUBSTR (v_list, 1, l_idx – 1));
v_list := SUBSTR (v_list, l_idx + LENGTH (p_sep));
ELSE
PIPE ROW (v_list);
EXIT;
END IF;
END LOOP;
END;
/
/* 创建 splitstr 函数 */
CREATE OR REPLACE FUNCTION splitstr (str IN CLOB,
i IN NUMBER := 0,
sep IN VARCHAR2 := ‘,’
)
RETURN VARCHAR2
/**************************************
* Name: splitstr
* Author: Sean Zhang.
* Date: 2012-09-03.
* Function: 返回字符串被指定字符分割后的指定节点字符串。
* Parameters: str: 待分割的字符串。
i: 返回第几个节点。当i为0返回str中的所有字符,当i 超过可被分割的个数时返回空。
sep: 分隔符,默认逗号,也可以指定字符或字符串。当指定的分隔符不存在于str中时返回sep中的字符。
* Example: select splitstr(‘abc,def’, 1) as str from dual; 得到 abc
select splitstr(‘abc,def’, 3) as str from dual; 得到 空
**************************************/
IS
t_i NUMBER;
t_count NUMBER;
t_str VARCHAR2 (4000);
BEGIN
IF i = 0
THEN
t_str := str;
ELSIF INSTR (str, sep) = 0
THEN
t_str := sep;
ELSE
SELECT COUNT ( * )
INTO t_count
FROM table (split (str, sep));
IF i THEN
SELECT str
INTO t_str
FROM (SELECT ROWNUM AS item, COLUMN_VALUE AS str
FROM table (split (str, sep)))
WHERE item = i;
END IF;
END IF;
RETURN t_str;
END;
/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1800483.html

(0)
上一篇 2025年2月21日 12:54:03
下一篇 2025年2月21日 12:54:19

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 使用PHP开发web应用程序有哪些优势

    PHP在Web应用程序开发中的优势:1. 开源免费;2. 易于学习;3. 丰富的库和框架;4. 跨平台兼容性;5. 与数据库无缝集成;6. 高效性能;7. 庞大的社区支持;8. 广泛的行业应用。 PHP开发Web应用程序的优势 PHP作为一…

    2025年2月23日
    100
  • Oracle中如何更新一张大表记录

    我们要看到Oracle Update的另一个方面,就是Undo、Redo和进程工作负载的问题。熟悉Oracle的朋友们知道,在DML操作的时候,Undo和 sql语句是一种方便的语言,同样也是一种“迷惑性”的语言。这个主要体现在它的集合操作…

    数据库 2025年2月23日
    100
  • Win10远程连接提示函数错误怎么办 Win10远程连接提示函数错误解决方法

    win10远程连接函数错误无法连接?当您在尝试远程连接windows 10电脑时遇到函数错误,这可能会阻碍您的连接尝试。如果您遇到此问题,请继续往下阅读,了解php小编香蕉提供的详细解决方案。本文将逐步指导您解决函数错误,让您能够成功建立远…

    2025年2月23日
    100
  • AWR的基本知识

    自从Oracle 10g开始支持AWR以后,相比于Statspack,除了有更多新的内容可供参考,HTML保存格式也是为查看文档提供了很多便利。说 自从oracle 10g开始支持awr以后,相比于statspack,除了有更多新的内容可供…

    数据库 2025年2月23日
    100
  • SQLite4 的设计

    SQLite4 对于SQLite3而言,是一个可选方案,而不是一个替代方案. SQLite3 还没有过时. SQLite3 和 QLite4 将会并行受到支持. SQL 1.0 内容提要 sqlite4 是一个放在库中的紧凑的,自包含的,零…

    数据库 2025年2月23日
    100
  • Oracle dbstart 无法正常启动处理办法

    Oracle dbstart 无法正常启动处理办法 [oracle@CentOS-1 ~]$ dbstart ORACLE_HOME_LISTNER is not SET, unable to auto-start Or oracle db…

    数据库 2025年2月23日
    100
  • 使用awk来解析dump文件

    dump文件是平时工作中经常碰见的,有时候得到一个dump,但是没有提供一些更多的信息,导入的时候就很可能会有问题。如果某个用户 dump文件是平时工作中经常碰见的,有时候得到一个dump,但是没有提供一些更多的信息,导入的时候就很可能会有…

    数据库 2025年2月23日
    100
  • 物理DG从库损坏后的重建

    由于是重建,原来DG环境中被重建的物理从库中的数据文件,日志文件,dump文件等都可以删除,切记原来的参数文件和相应目录一定要保 由于是重建,原来dg环境中被重建的物理从库中的数据文件,日志文件,dump文件等都可以删除,切记原来的参数文件…

    数据库 2025年2月23日
    100
  • Oracle性能优化有时就这么简单_index

    性能优化有时就这么简单 一、概述 最近有一个系统(aix6.1+Oracle10.2.0.5 RAC)CPU每五分钟就达到百分之百,这个系统是监控系统 性能优化有时就这么简单 一、概述 最近有一个系统(aix6.1+Oracle10.2.0…

    数据库 2025年2月23日
    100
  • Oracle 重建表(rename)注意事项总结

    前一段时间,有一个DBA朋友在完成重建表(rename)工作后,第二天早上业务无法正常运行,出现数据无法插入的限制和错误,后来分析才 一、概述 前一段时间,有一个DBA朋友在完成重建表(rename)工作后,第二天早上业务无法正常运行,出现…

    数据库 2025年2月23日
    100

发表回复

登录后才能评论