`

Oralce自定义函数实现字符串分割

 
阅读更多

1.定义自定义类型,函数返回自定义类型
SQL> create or replace type str_split is table of varchar2(1000);
  2  /
 
Type created
 
2.用一个Function来实现字符串分割的功能。
/*
* 功能:字符串分割。
* 参数:p_str 分割的字符串
*       p_delimiter 分隔符
*/
create or replace function fun_str_split(p_str       in varchar2,
                                         p_delimiter in varchar2)
    return str_split
    pipelined is
    v_start  number := 1; --开始查找的位置
    v_index  number := 0; --查找到的索引
    v_length number := length(p_str); --字符串长度
begin
   
    while (v_start <= v_length) loop
        --从开始位置开始查找,每次查找完毕更新开始位置为查找到的位置。
        v_index := instr(p_str, p_delimiter, v_start);
       
        if v_index = 0 then
            --未找到,说明结束了
            pipe row(substr(p_str, v_start));
            v_start := v_length + 1;
        else
            pipe row(substr(p_str, v_start, v_index - v_start));
            v_start := v_index + 1;--查找到的索引 + ','占的长度
        end if;
   
    end loop;
   
    return;
end;

3.测试
SQL> select * from table(fun_str_split('hello,world,abc',','));
 
COLUMN_VALUE
--------------------------------------------------------------------------------
hello
world
abc

//注意上面使用了column_value,这是一个PIPELINED function返回的默认列的名字。

关于pipelined(摘自http://www.linuxidc.com/Linux/2011-05/35797.htm
pipelined是Oracle的一个关键字。
普通函数的结尾加一个pipelined关键字,就是管道函数。
这个函数的返回参数类型为集合,这是为了使其能作为表函数使用。
表函数就是在from子句中以table(v_resultset)调用的,v_resultset就是一个集合类型的参数。
管道化表函数必须返回一个集合。
在函数中,PIPE ROW 语句被用来返回该集合的单个元素,该函数必须以一个空的 RETURN 语句结束,以表明它已经完成。
一旦我们创建了上述函数,我们就可以使用 TABLE 操作符从 SQL 查询中调用它。
//典型的Pipelined例子  
//当使用PL/SQL表函数时,下面是典型的步骤  
//生产函数必须在其定义中使用PIPELINED关键字  
//生产函数必须使用一个out参数,这个参数是一个集合,对应到返回的结果集  
//一旦有结果产生,通过使用PIPE ROW关键字将其输送给消费函数  
//生产函数必须以RETURN语句结束,但是不需要制定返回值  
//消费函数必须使用TABLE关键字,将从PIPELINE function返回的行集当成一个常规表  
//第一步.定义一个返回的行集的格式。  
//在这个实例中,我们返回这三个类型的值:int,date,varchar2(25)  
CREATE OR REPLACE TYPE myObjectFormat   
AS OBJECT  
(  
  A   INT,  
  B   DATE,  
  C   VARCHAR2(25)  
)  
/  

//下一步,为第一步定义的类型定义一个集合类型  
CREATE OR REPLACE TYPE myTableType  
   AS TABLE OF myObjectFormat  
/  

//最后,生产函数被打包到一个包里面,它是一个pipelined function就像被pipelined关键字所标记一样。  
CREATE OR REPLACE PACKAGE myDemoPack  
AS  
      FUNCTION prodFunc RETURN myTableType PIPELINED;  
END;  
/  

CREATE OR REPLACE PACKAGE BODY myDemoPack AS  
FUNCTION prodFunc RETURN myTableType PIPELINED IS  
BEGIN  
  FOR i in 1 .. 5  
    LOOP  
      PIPE ROW (myObjectFormat(i,SYSDATE+i,'Row '||i));  
    END LOOP;  
    RETURN;  
  END;  
END;  
/  

//测试结果:  
alter session set nls_date_format='yyyy-mm-dd';  
SELECT * FROM TABLE(myDemoPack.prodFunc());  
                A B           C  
----------------- ----------- ------------  
                1 2011-05-05  Row 1  
                2 2011-05-06  Row 2  
                3 2011-05-07  Row 3  
                4 2011-05-08  Row 4  
                5 2011-05-09  Row 5  
//结论:  
//在一个select语句里面,我们需要一个数据源,而不是一张表的话,Pipelined functions非常有用。 

分享到:
评论

相关推荐

    oracle 自定义函数 解析文件以“|”分割字符串

    oracle 自定义函数 解析文件以“|”分割字符串

    Oracle拆分字符串,字符串分割的函数

    虽然这不是直接的字符串分割函数,但可以配合其他函数一起使用,实现字符串的拆分。 2. **SUBSTR() 函数** `substr()` 用于从字符串中提取指定长度的部分。例如,`substr(string, start_position, length)` 返回从...

    oracle字符串分割自定义函数

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

    oracle split函数

    本文将详细介绍两种在Oracle中实现字符串分割的方法:第一种是通过创建类型和管道函数的方式;第二种则是通过循环和子字符串处理实现的。 #### 二、第一种实现方式:创建类型和管道函数 ##### 1. 创建类型 `TY_STR...

    oracle分隔字符串函数

    本文详细介绍了如何在 Oracle 数据库中实现字符串分隔的功能,通过自定义函数 `splitstr` 实现了根据用户定义的分隔符来分割字符串的目标。这种方法不仅灵活,而且易于维护和扩展,非常适合于处理各种复杂的字符串...

    oracle split 函数

    Oracle标准SQL并没有提供直接用于字符串分割的内置函数,因此开发者通常会通过自定义函数的方式来实现这一功能。本篇文章将详细介绍如何在Oracle中实现一个名为`split`的函数来完成字符串的分割,并将其结果以表的...

    oracle_split_函数_返回数组

    这两种方法在处理不同情况下的字符串分割时可能有不同的效果。例如,如果字符串中的分隔符是多字符的,或者字符串包含连续的分隔符,那么可能需要对这些情况进行特殊处理,以确保正确地拆分字符串。在实际使用时,应...

    plsql分割字符串

    通过对`FUNCTION_SF_SPLIT_STRING`的详细分析,我们可以看到,在PL/SQL中实现字符串分割不仅需要理解基本的字符串操作函数,还需要具备良好的逻辑思维和控制结构设计能力。掌握这种方法不仅可以提高数据库应用程序的...

    oracle数据库自定义split函数和调用具体实现

    首先,我们可以使用Oracle的内置函数`REGEXP_SUBSTR`来实现字符串的拆分。`REGEXP_SUBSTR`用于从字符串中提取符合正则表达式模式的部分。在这个例子中,正则表达式`[^/]+`表示匹配除斜杠之外的任何字符的一个或多个...

    Oracle 自定义split 函数实例详解

    在Oracle数据库中,系统并未内置一个直接用于字符串分割的`SPLIT`函数,但我们可以根据需求自定义一个。本文将详细介绍如何在Oracle中创建一个自定义的`SPLIT`函数,以及如何使用这个函数进行字符串处理。 首先,...

    重写oracle wm_contact函数

    - **FUN_STRSPLIT_TABLE**: 这个函数用于将输入的字符串按指定的分隔符分割,并将结果存储在一个表类型中返回。它通过循环处理字符串,不断提取子串并将其加入结果集中。 - **FUN_JOIN_STR**: 这个函数用于将输入...

    Oracle 验证是否是日期

    本文将详细介绍一个自定义的Oracle函数`FN_ISDATE_JAVA`,该函数用于判断给定的字符串是否能够转换为有效的日期格式。 #### 函数概述 函数`FN_ISDATE_JAVA`的主要功能是验证输入的字符串是否符合日期格式...

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

    在Oracle数据库环境中,有时我们需要对字符串进行处理,例如将一个包含多个值的字符串分割成多个单独的元素。在描述中提到的传统方法可能涉及到创建临时表,这种方法在处理大量数据时效率较低。为了解决这个问题,...

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

    这是Oracle中的自定义表类型,用于存储分割后的子字符串。函数接受两个参数:`p_str`是要分割的字符串,`p_delimiter`是作为分隔符的字符。通过`INSTR`函数找到分隔符的位置,然后使用`SUBSTR`截取子字符串,并将...

    Oracle函数文档

    - **字符串处理函数**:如SUBSTR截取子串,INSTR查找子串位置,REPLACE替换字符串,UPPER/LOWER转换大小写等。 - **转换函数**:TO_CHAR、TO_DATE和TO_NUMBER用于数据类型间的转换。 2. **PL/SQL过程和函数**: ...

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

    在本文中,我们将探讨如何在Oracle中添加`split`和`splitstr`这两个自定义函数,以优化批量操作的性能。 首先,我们需要创建一个名为`tabletype`的表类型,用于存储分割后的字符串元素: ```sql create or replace...

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

    这里介绍的方法是创建两个用户自定义函数,即`split`和`splitstr`,用于将逗号分隔的ID字符串分割成多个元素,便于存储过程中的批量处理。 首先,创建一个名为`tabletype`的表类型,它是用来存储函数返回的多个字符...

    问题:oracle中插入分割时间的sql语句

    源码可能涉及自定义函数或存储过程,用于处理特定的时间分割和插入需求。 6. datecha.xls文件: 提到的datecha.xls文件可能包含一个示例数据集,用于演示如何处理时间数据。通常,你可以打开这个Excel文件,查看...

    oracle学习参考

    - **字符串的行转列**:Oracle提供了`REGEXP_SUBSTR`函数结合正则表达式来分割字符串。例如,通过匹配非`#`字符,可以逐个提取`#`分隔的子串。 - **字符串的列转行**:对于简单的列转行,可以使用`LISTAGG`函数,...

Global site tag (gtag.js) - Google Analytics