热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

给Oracle添加split和splitstr函数

给Oracle添加split和splitstr函数最近项目中有很多需要做批量操作的需求,客户端把一组逗号分隔的ID字符串传给数据库,存储过程就需要把它们分割,然后逐个处理。www.2cto.com以往的处理方式有如下几种:1、...SyntaxHighlighter.all();

给Oracle添加split和splitstr函数
 
最近项目中有很多需要做批量操作的需求,客户端把一组逗号分隔的ID字符串传给数据库,存储过程就需要把它们分割,然后逐个处理。
  www.2cto.com  
以往的处理方式有如下几种:
 
1、在存储过程内写循环,逐个分析字符串中的ID,然后逐个处理。缺点:循环一次处理一个,如果每次判断都很多,效率将很受影响。适合每次处理要做单独判断的情况。
 
2、使用临时表,先调用一个存储过程将ID拆分并插入到临时表中,然后结合临时表可以写SQL一次处理多笔。缺点:需要插临时表,效率不高,数据量越大影响越严重。
 
以前的项目用的最多的还是第2中方式,毕竟方便,且效率比第1种好。 
 
现在项目中用到了很多很多的批量操作,很多的重复代码让我不厌其烦。忽然想到,.Net和JS中都有split类似的函数,拆分字符串很方便,oracle中要是也有这样的功能该多好呀。
 
多方查找资料发现,给oracle添加split函数是完全可以实现的,避免了插入临时表,所以效率比上面的第2中方法效率高很多。
 
后来我还添加了splitstr函数,可以很方便获取字符串中的指定节点。 
 
有了这两个函数,处理批量操作,真是如虎添翼,效率倍增,嘿嘿……
 
好了,闲话少说,上代码!如有不妥之处,请各位前辈博友斧正。
 
 1 /*
 2  * Oracle 创建 split 和 splitstr 函数
 3  */
 4 
 5 /* 创建一个表类型 */
 6 create or replace type tabletype as table of VARCHAR2(32676)
 7 /
 8 
 9 /* 创建 split 函数 */
10 CREATE OR REPLACE FUNCTION split (p_list CLOB, p_sep VARCHAR2 := ',')
11    RETURN tabletype
12    PIPELINED
13 /**************************************
14  * Name:        split
15  * Author:      Sean Zhang.
16  * Date:        2012-09-03.
17  * Function:    返回字符串被指定字符分割后的表类型。
18  * Parameters:  p_list: 待分割的字符串。
19                 p_sep: 分隔符,默认逗号,也可以指定字符或字符串。
20  * Example:     SELECT *
21                   FROM users
22                  WHERE u_id IN (SELECT COLUMN_VALUE
23                                   FROM table (split ('1,2')))
24                 返回u_id为1和2的两行数据。
25  **************************************/
26 IS
27    l_idx    PLS_INTEGER;
28    v_list   VARCHAR2 (32676) := p_list;
29 BEGIN
30    LOOP
31       l_idx   := INSTR (v_list, p_sep);
32 
33       IF l_idx > 0
34       THEN
35          PIPE ROW (SUBSTR (v_list, 1, l_idx - 1));
36          v_list   := SUBSTR (v_list, l_idx + LENGTH (p_sep));
37       ELSE
38          PIPE ROW (v_list);
39          EXIT;
40       END IF;
41    END LOOP;
42 END;
43 /
44 
45 /* 创建 splitstr 函数 */
46 CREATE OR REPLACE FUNCTION splitstr (str IN CLOB,
47                                        i   IN NUMBER := 0,
48                                        sep IN VARCHAR2 := ','
49 )
50    RETURN VARCHAR2
51 /**************************************
52  * Name:        splitstr
53  * Author:      Sean Zhang.
54  * Date:        2012-09-03.
55  * Function:    返回字符串被指定字符分割后的指定节点字符串。
56  * Parameters:  str: 待分割的字符串。
57                 i: 返回第几个节点。当i为0返回str中的所有字符,当i 超过可被分割的个数时返回空。
58                 sep: 分隔符,默认逗号,也可以指定字符或字符串。当指定的分隔符不存在于str中时返回sep中的字符。
59  * Example:     select splitstr('abc,def', 1) as str from dual;  得到 abc
60                 select splitstr('abc,def', 3) as str from dual;  得到 空
61  **************************************/
62 IS
63    t_i       NUMBER;
64    t_count   NUMBER;
65    t_str     VARCHAR2 (4000);
66 BEGIN
67    IF i = 0
68    THEN
69       t_str   := str;
70    ELSIF INSTR (str, sep) = 0
71    THEN
72       t_str   := sep;
73    ELSE
74       SELECT COUNT ( * )
75       INTO t_count
76       FROM table (split (str, sep));
77 
78       IF i <= t_count
79       THEN
80          SELECT str
81          INTO t_str
82          FROM (SELECT ROWNUM AS item, COLUMN_VALUE AS str
83                FROM table (split (str, sep)))
84          WHERE item = i;
85       END IF;
86    END IF;
87 
88    RETURN t_str;
89 END;
90 /
 

推荐阅读
  • 本文深入探讨了在MySQL数据库中利用innobackupex工具进行备份,并结合binlog日志实现数据库的完整恢复过程。适合对数据库管理和维护有一定需求的技术人员阅读。 ... [详细]
  • Pikachu SQL注入实战解析
    作为一名网络安全新手,本文旨在记录个人在SQL注入方面的学习过程与心得,以备后续复习之用。通过逐步深入的学习,力求掌握每个知识点后再向下一个挑战迈进。 ... [详细]
  • 自SQL Server 2005以来,微软的这款数据库产品逐渐崭露头角,成为企业级应用中的佼佼者。本文将探讨SQL Server 2008的革新之处及其对企业级数据库市场的影响。 ... [详细]
  • 深入解析Apache SkyWalking CVE-2020-9483 SQL注入漏洞
    本文详细探讨了Apache SkyWalking中的SQL注入漏洞(CVE-2020-9483),特别是其影响范围、漏洞原因及修复方法。Apache SkyWalking是一款强大的应用性能管理工具,广泛应用于微服务架构中。然而,该漏洞使得未经授权的攻击者能够通过特定的GraphQL接口执行恶意SQL查询,从而获取敏感信息。 ... [详细]
  • 使用RODBC库将数据导入R时遇到的问题:如何在长查询中传递变量而不产生换行符。 ... [详细]
  • 本文旨在探讨机器学习与数据分析之间的差异,不仅在于它们处理的数据类型,还包括技术背景、业务应用场景以及参与者的不同。通过深入分析,希望能为读者提供清晰的理解。 ... [详细]
  • 导入大csv文件到mysql(CSV导入) ... [详细]
  • 当 MySQL 的 autocommit 设置为 1 时,如果在一个事务中执行了 DDL 语句,那么该事务中从开始到执行 DDL 语句之前的所有 DML 操作将自动提交。随后的 DML 操作则需要在新的事务中进行。 ... [详细]
  • 本文档详细介绍了2017年8月31日关于MySQL数据库备份与恢复的教学内容,包括MySQL日志功能、备份策略、备份工具及实战演练。 ... [详细]
  • NIO 通道接口详解
    本文介绍了NIO(New Input/Output)中的通道接口及其相关概念,包括通道的基本功能、接口设计以及各类通道接口的具体用途。通过本文,读者可以深入了解NIO通道的设计原理及其在实际项目中的应用。 ... [详细]
  • 深入探讨PHP中的输出缓冲技术(Output Buffering)
    本文深入解析了PHP中输出缓冲(Output Buffering)的原理及其在Web开发中的应用,特别是如何通过输出缓冲技术有效管理HTTP头部信息,提高代码的灵活性与健壮性。 ... [详细]
  • 本文详细介绍了如何解决Oracle数据库中出现的ORA-28002错误,即密码将在1天内过期的问题,包括原因分析及解决方案。 ... [详细]
  • 本文提供了一套实用的方法论,旨在帮助开发者构建能够应对高并发请求且易于扩展的Web服务。内容涵盖了服务器架构、数据库管理、缓存策略以及异步处理等多个方面。 ... [详细]
  • 作为一名计算机科学专业的大三学生,我在过去的一年里自学了Visual Basic (VB),但感觉进展缓慢。VB的学习是否仅仅局限于控件的使用?如何有效地学习API?此外,有人认为Basic语言已经过时,这对VB的未来意味着什么? ... [详细]
  • 本文探讨了在Python中利用sqlite3库创建或重定义SQLite函数的方法,包括自定义函数和修改现有函数的行为。 ... [详细]
author-avatar
语笑嫣然小公主155
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有