`

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字符串分割自定义函数

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

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例079 自定义函数截取中文字符串 113 实例080 公告标题的截取 114 实例081 论坛内容的简短输出 116 实例082 自定义函数过滤字符串 117 2.8 字符串 118 实例083 过滤论坛帖子中的空白和特殊字符 118 实例084 对论坛...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例079 自定义函数截取中文字符串 113 实例080 公告标题的截取 114 实例081 论坛内容的简短输出 116 实例082 自定义函数过滤字符串 117 2.8 字符串 118 实例083 过滤论坛帖子中的空白和特殊字符 118 实例084 对论坛...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例074 将字符串的每个字符进行倒序输出 94 实例075 获取字符串中汉字的个数 94 实例076 批量替换某一类字符串 95 实例077 把异常与错误信息显示到窗体中 97 实例078 从字符串中分离文件路径、 文件名及扩展名 98 ...

    php网络开发完全手册

    7.5.7 用正则表达式进行字符串分割 7.5.7 ——preg_split 115 7.6 字符操作的注意事项 117 7.7 小结 118 第8章 数组操作与数据结构算法 119 8.1 一维数组与多维数组 119 8.1.1 一维数组简介 119 8.1.2 多维数组简介 ...

    vc++ 应用源码包_1

    基于MFC和STL平台的字符串类,可以实现在快速字符串搜索。 enum_display_modes_demo.zip enum_display_modes_src.zip 列出所有的显示模式并列表出来,通过单击列表来改变显示分辨率。 iconbutton_demo.zip ...

    vc++ 应用源码包_2

    基于MFC和STL平台的字符串类,可以实现在快速字符串搜索。 enum_display_modes_demo.zip enum_display_modes_src.zip 列出所有的显示模式并列表出来,通过单击列表来改变显示分辨率。 iconbutton_demo.zip ...

    vc++ 应用源码包_6

    基于MFC和STL平台的字符串类,可以实现在快速字符串搜索。 enum_display_modes_demo.zip enum_display_modes_src.zip 列出所有的显示模式并列表出来,通过单击列表来改变显示分辨率。 iconbutton_demo.zip ...

    vc++ 应用源码包_5

    基于MFC和STL平台的字符串类,可以实现在快速字符串搜索。 enum_display_modes_demo.zip enum_display_modes_src.zip 列出所有的显示模式并列表出来,通过单击列表来改变显示分辨率。 iconbutton_demo.zip ...

    vc++ 应用源码包_3

    基于MFC和STL平台的字符串类,可以实现在快速字符串搜索。 enum_display_modes_demo.zip enum_display_modes_src.zip 列出所有的显示模式并列表出来,通过单击列表来改变显示分辨率。 iconbutton_demo.zip ...

    C#编程经验技巧宝典

    72 &lt;br&gt;0102 将字符串首字母转换大写 72 &lt;br&gt;0103 如何进行字节数组和字符串的相互转换 72 &lt;br&gt;0104 如何把一个按空格分割的字符串存储在一个ArrayList数组中 73 &lt;br&gt;4.2 获取字符串信息 73 ...

    vc++ 开发实例源码包

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    Visual C++程序开发范例宝典(光盘) 第四部分

    实例283 在查询语句中使用字符串函数 实例284 在查询中使用日期函数 实例285 在查询时为表中的空字段添加默认信息 第10章 打印与报表技术 10.1 基础报表打印 实例286 基于文档/视图结构的打印 实例287 基于...

Global site tag (gtag.js) - Google Analytics