`

给ORACLE添加split和splitstr函数

 
阅读更多

转自:http://www.cnblogs.com/enjoycode/archive/2012/11/10/oracle_split.html

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

 

以往的处理方式有如下几种:

 

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 / 

 转自:http://hi.baidu.com/zha0ku1/item/0e65dda912f0cdfa14329b0b

oracle中的split 字符串分割函数(绝对可用)

Oracle中的Split函数首先需要定义 2 个类型

1. Row 类型CREATE OR REPLACE TYPE ty_row_str_split  as object (strValue VARCHAR2 (4000))

2. Table 类型CREATE OR REPLACE TYPE ty_tbl_str_split IS TABLE OF ty_row_str_split

创建函数:

CREATE OR REPLACE FUNCTION fn_split(p_str       IN VARCHAR2,

                                     p_delimiter IN VARCHAR2)

  RETURN ty_tbl_str_split IS

   j         INT := 0;

   i         INT := 1;

  len       INT := 0;

   len1      INT := 0;

  str       VARCHAR2(4000);

   str_split ty_tbl_str_split := ty_tbl_str_split();

BEGIN

  len   := LENGTH(p_str);

   len1 := LENGTH(p_delimiter);

 

 

  WHILE j < len LOOP

     j := INSTR(p_str, p_delimiter, i);

  

    IF j = 0 THEN

       j    := len;

      str := SUBSTR(p_str, i);

       str_split.EXTEND;

       str_split(str_split.COUNT) := ty_row_str_split(strValue => str);

    

      IF i >= len THEN

        EXIT;

      END IF;

    ELSE

      str := SUBSTR(p_str, i, j - i);

       i    := j + len1;

       str_split.EXTEND;

       str_split(str_split.COUNT) := ty_row_str_split(strValue => str);

    END IF;

  END LOOP;

 

 

  RETURN str_split;

END fn_split;

 

 

使用样例:

select to_number(strvalue) as Value from table(fn_split('1,2,3',','))

select to_char(strvalue) as Value from table(fn_split('aa,bb,cc',',')) 

分享到:
评论

相关推荐

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

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

    添加split和splitstr函数-oracle培训.pdf

    。。。

    添加split和splitstr函数-oracle培训.docx

    。。。

    oracle字符串分割自定义函数

    oracle中没有方便分割字符串的的函数,仿照c#中的split方法和网友的方法,并进行了改进,(1)先自定义个类型str_split,(2)分割函数splitstr,返回table;(3)取第n个数组的get_splitstr,用户1,2,3部建好,使用时只需要...

    SQL实现字符串拆分2函数:splitstr,GetCharItem

    select * from dbo.splitstr('a,b,c,d,e') --返回表格 a b c d e --用处 select * from tbtable where ZID in (select ZValue from dbo.splitstr('a,b,c,d,e')) --用法 select dbo.GetCharItem('A,B,C,DE,F,GH',',...

    f_splitstr(分割字符串).sql

    f_splitstr(分割字符串),根据业务可自行设定需要分割的字符串。

    sqlserver自定义函数

    --全角和半角转换函数 Create FUNCTION f_Convert( @str NVARCHAR(4000), --要转换的字符串 @flag bit --转换标志,0转换成半角,1转换成全角 )RETURNS nvarchar(4000) AS BEGIN DECLARE @pat nvarchar(8)...

    oracle 函数判断字符串是否包含图片格式的实例代码

    首先是写一个分割字符串的函数,返回table类型 CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2) RETURN ty_str_split IS j INT := 0; i INT := 1; len INT := 0; len1 INT...

    sql 分割字符串 dbo.Split('',',')

    将字符串按某个固定字符拆分成一个表结构(value,id) eg:1,2,3,3,4 拆分后: value id 1 1 2 2 3 3 3 4 4 5

    sql函数和事务

    CREATE FUNCTION SplitStr (@splitString varchar(8000), @separate varchar(10)) RETURNS @returnTable table(id int, col_Value varchar(50)) AS BEGIN declare @thisSplitStr varchar(50) declare @...

    SQL Server分隔函数实例详解

    有时候我们在SQL Server中需要对一些字符串进行分隔,比如a,b,c ,按照‘,’进行分割,可以使用下边这个函数方法,新建方法如下:  CREATE FUNCTION dbo.f_splitstr(@SourceSql NVARCHAR(MAX),@StrSeprate VARCHAR...

    netDxf的扩展示例

    String[] splitstr = lines.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries); //Console.WriteLine("Length=" + splitstr.Length); for (int i = 0; i &lt; splitstr.Length; i++) { ...

    SQL Server分隔函数

    有时候我们在SQL Server中需要对一些字符串进行分隔,比如a,b,c ,按照‘,’进行分割,可以使用下边这个函数方法,新建方法如下:  CREATE FUNCTION dbo.f_splitstr(@SourceSql NVARCHAR(MAX),@StrSeprate VARCHAR...

    splitStrJS:多个分隔符作为数组拆分字符串功能(它既支持数组作为分隔符,也支持一个分隔符作为字符串)

    这些函数位于splitStr.js中,您可以复制它们以使用它们,或者将其作为模块使用,写回导出方法,具体取决于您所处的上下文,节点是否已经完成,es2015是否可以使用导出默认值和导入语句。 选择适合您的功能。 test....

    Delphi 版 HTML5 WebSocket Server 代码

    即调用下面的ShakeHand函数。如果不是#0,则为连接后的数据信息,请自行解析。 参数:接收到的数据和长度。 返回:HTML5 Client的IP地址和端口。 代码中包括: HTML5 WebSocket 握手协议的说明及解析代码; ...

    StringTokenizer的使用

    if(splitStr==null||splitStr.trim().equals("")){ splitStr=" "; } StringTokenizer st = new StringTokenizer(str, splitStr,false); System.out.println("ArraySize:"+st.countTokens()); arr...

    c# 字符串操作类

    /// /// 字符串操作类 /// 1、GetStrArray(string str, char speater, bool ... /// 13、SplitMulti(string str, string splitstr)分割字符串 /// 14、SqlSafeString(string String, bool IsDel) /// 等操作

    jad 最新版java反编译

    -l&lt;num&gt; - split strings into pieces of max &lt;num&gt; chars (splitstr) -lnc - output original line numbers as comments (lnc) -lradix&lt;num&gt;- display long integers using the specified radix -nl - split ...

Global site tag (gtag.js) - Google Analytics