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

前端之家收集整理的这篇文章主要介绍了给Oracle添加split和splitstr函数的方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

最近项目中有很多需要做批量操作的需求,客户端把一组逗号分隔的ID字符串传给数据库,存储过程就需要把它们分割,然后逐个处理。 @H_301_0@以往的处理方式有如下几种: 1、在存储过程内写循环,逐个分析字符串中的ID,然后逐个处理。缺点:循环一次处理一个,如果每次判断都很多,效率将很受影响。适合每次处理要做单独判断的情况。2、使用临时表,先调用一个存储过程将ID拆分并插入到临时表中,然后结合临时表可以写sql一次处理多笔。缺点:需要插临时表,效率不高,数据量越大影响越严重。 以前的项目用的最多的还是第2中方式,毕竟方便,且效率比第1种好。 @H_301_0@现在项目中用到了很多很多的批量操作,很多的重复代码让我不厌其烦。忽然想到,.Net和JS中都有split类似的函数,拆分字符串很方便,oracle中要是也有这样的功能该多好呀。 多方查找资料发现,给oracle添加split函数是完全可以实现的,避免了插入临时表,所以效率比上面的第2中方法效率高很多。 后来我还添加了splitstr函数,可以很方便获取字符串中的指定节点。 @H_301_0@有了这两个函数,处理批量操作,真是如虎添翼,效率倍增,嘿嘿…… @H_301_0@好了,闲话少说,上代码!如有不妥之处,请各位前辈博友斧正。 @H_301_0@<div class="codetitle"><a style="CURSOR: pointer" data="65946" class="copybut" id="copybut65946" onclick="doCopy('code65946')"> 代码如下:

<div class="codebody" id="code65946"> @H_3010@/* @H301_0@ Oracle 创建 split 和 splitstr 函数 @H_301_0@/ @H_3010@/ 创建一个表类型 / @H3010@create or replace type tabletype as table of VARCHAR2(32676) @H3010@/ @H301_0@/ 创建 split 函数 / @H_301_0@CREATE OR REPLACE FUNCTION split (p_list CLOB,psep VARCHAR2 := ',') @H3010@RETURN tabletype @H3010@PIPELINED @H3010@/** @H3010@* Name: split @H3010@* Author: Sean Zhang. @H3010@* Date: 2012-09-03. @H3010@* Function: 返回字符串被指定字符分割后的表类型。 @H301_0@ Parameters: plist: 待分割的字符串。 @H301_0@psep: 分隔符,默认逗号,也可以指定字符或字符串。 @H301_0@ Example: SELECT * @H_3010@FROM users @H301_0@WHERE u_id IN (SELECT COLUMNVALUE @H3010@FROM table (split ('1,2'))) @H301_0@返回uid为1和2的两行数据。 @H3010@**/ @H3010@IS @H301_0@l_idx PLSINTEGER; @H301_0@v_list VARCHAR2 (32676) := plist; @H3010@BEGIN @H3010@LOOP @H301_0@l_idx := INSTR (v_list,psep); @H301_0@IF lidx > 0 @H3010@THEN @H301_0@PIPE ROW (SUBSTR (v_list,1,lidx - 1)); @H301_0@v_list := SUBSTR (v_list,l_idx + LENGTH (psep)); @H3010@ELSE @H301_0@PIPE ROW (vlist); @H3010@EXIT; @H3010@END IF; @H3010@END LOOP; @H3010@END; @H3010@/ @H301_0@/ 创建 splitstr 函数 / @H_3010@CREATE OR REPLACE FUNCTION splitstr (str IN CLOB,@H3010@i IN NUMBER := 0,@H3010@sep IN VARCHAR2 := ',' @H3010@) @H3010@RETURN VARCHAR2 @H3010@/** @H3010@* Name: splitstr @H3010@* Author: Sean Zhang. @H3010@* Date: 2012-09-03. @H3010@* Function: 返回字符串被指定字符分割后的指定节点字符串。 @H3010@* Parameters: str: 待分割的字符串。 @H3010@i: 返回第几个节点。当i为0返回str中的所有字符,当i 超过可被分割的个数时返回空。 @H3010@sep: 分隔符,默认逗号,也可以指定字符或字符串。当指定的分隔符不存在于str中时返回sep中的字符。 @H3010@* Example: select splitstr('abc,def',1) as str from dual; 得到 abc @H3010@select splitstr('abc,3) as str from dual; 得到 空 @H3010@**/ @H3010@IS @H301_0@ti NUMBER; @H301_0@tcount NUMBER; @H301_0@tstr VARCHAR2 (4000); @H3010@BEGIN @H3010@IF i = 0 @H3010@THEN @H301_0@tstr := str; @H3010@ELSIF INSTR (str,sep) = 0 @H3010@THEN @H301_0@tstr := sep; @H3010@ELSE @H3010@SELECT COUNT ( * ) @H301_0@INTO tcount @H3010@FROM table (split (str,sep)); @H301_0@IF i <= tcount @H3010@THEN @H3010@SELECT str @H301_0@INTO tstr @H301_0@FROM (SELECT ROWNUM AS item,COLUMNVALUE AS str @H3010@FROM table (split (str,sep))) @H3010@WHERE item = i; @H3010@END IF; @H3010@END IF; @H301_0@RETURN tstr; @H3010@END; @H3010@/ @H301_0@

猜你在找的Oracle相关文章