关于 pipe row的用法2009/12/30 14:53

=========================================================== 作者: flysky0814(http://flysky0814.itpub.net)
发表于:2007.11.28 11:14
分类: oracle10g
出处:http://flysky0814.itpub.net/post/35477/419443
--------------------------------------------------------------- 为了让 PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。Oracle 9i 通过引入的管道化表函数纠正了后一种情况。表函数是返回整个行的集(通常作为一个集合)的函数,可以直接从 SQL 语句中进行查询,就好像它是一个真正的数据库表一样。管道化表函数与之相似,但是它像在构建时一样返回数据,而不是一次全部返回。管道化表函数更加有效, 因为数据可以尽可能快地返回。

管道化表函数必须返回一个集合。在函数中,PIPE ROW 语句被用来返回该集合的单个元素,该函数必须以一个空的 RETURN 语句结束,以表明它已经完成。一旦我们创建了上述函数,我们就可以使用 TABLE 操作符从 SQL 查询中调用它。

管道化表函数经常被用来把数据从一种类型转化成另一种类型。

下面是用 Pipelined Table 实现 split 函数的例子:

CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);

CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)RETURN ty_str_split PIPELINEDISj INT := 0;i INT := 1;len INT := 0;len1 INT := 0;str VARCHAR2 (4000);BEGINlen := LENGTH (p_str);len1 := LENGTH (p_delimiter);

WHILE j < lenLOOPj := INSTR (p_str, p_delimiter, i);

IF j = 0THENj := len;str := SUBSTR (p_str, i);PIPE ROW (str);

IF i >= lenTHENEXIT;END IF;ELSEstr := SUBSTR (p_str, i, j - i);i := j + len1;PIPE ROW (str);END IF;END LOOP;

RETURN;END fn_split;/

测试:SELECT * FROM TABLE (fn_split ('1;;12;;123;;1234;;12345', ';;'));

结果:112123123412345 一个简单的例子:CREATE TYPE mytype AS OBJECT (field1 NUMBER,field2 VARCHAR2 (50));

CREATE TYPE mytypelist AS TABLE OF mytype;

CREATE OR REPLACE FUNCTION pipelinemeRETURN mytypelist PIPELINEDISv_mytype mytype;BEGINFOR v_count IN 1 .. 20LOOPv_mytype := mytype (v_count, 'Row ' || v_count);PIPE ROW (v_mytype); END LOOP;

RETURN;END pipelineme;SELECT * FROM TABLE (pipelineme);FIELD1 FIELD2 ------ ------------------------1 Row 12 Row 23 Row 34 Row 45 Row 56 Row 67 Row 78 Row 89 Row 910 Row 1011 Row 1112 Row 1213 Row 1314 Row 1415 Row 1516 Row 1617 Row 1718 Row 1819 Row 1920 Row 20

*********************************

create or replace type dlsys.split_tbl as table of varchar2(32767);

create or replace function dlsys.dlsplit(p_list varchar2,
                                         p_del varchar2 := ',')
return dlsys.split_tbl
pipelined is
l_idx pls_integer;
l_list varchar2(32767) := p_list;
begin
loop
    l_idx := instr(l_list, p_del);
    if l_idx > 0 then
      pipe row(substr(l_list, 1, l_idx - 1));
      l_list := substr(l_list, l_idx + length(p_del));
    else
      pipe row(l_list);
      exit;
    end if;
end loop;
return;
end dlsplit;

-----------------------------------------------------------------------------------------------

DECLARE
  a   ty_str_split  ;
BEGIN
   select   fn_split ('1;;12;;123;;1234;;12345;;w', ';;') into a from dual ;
   a(1) := 'ell';
   dbms_output.put_line(a(100));
   null;
END;

pipe row的用法, Oracle split 函数写法.相关推荐

  1. (转)pipe row的用法, Oracle split 函数写法.

    本文转载自:http://www.cnblogs.com/newsea/archive/2010/12/14/1905482.html 关于 pipe row的用法2009/12/30 14:53 = ...

  2. oracel Pipelined pipe row的用法

    oracle的管道也可以返回集合类型,跟游标类似 CREATE TYPE my_type AS OBJECT (    field1 NUMBER,    field2 VARCHAR2 (50)   ...

  3. oracle中的and用法,Oracle bitand( )函数简介

    Oracle bitand( )函数在Oracle数据库中是很常见的,下面就为您详细介绍Oracle bitand( )函数的用法,如果您感兴趣的话,不妨一看. Oracle bitand( )函数: ...

  4. Oracle split函数

    一.创建split函数 1.创建TYPE CREATE OR REPLACE TYPE TYPE_SPLIT AS TABLE OF VARCHAR2 (4000); / 2.创建split函数 CR ...

  5. split mysql的用法_mysql split函数用法实例

    首先,大家要知道的是,在mysql中并没有split函数,需要自己写. 比如下面几个mysql split函数的例子. 例1,获得按指定字符分割的字符串的个数: 复制代码 代码示例: DELIMITE ...

  6. oracle split函数用法_「干货」Python字符串中的split方法

    前面的文章我们有简单的介绍过什么是字符串.Python字符串的输入方式.Python字符串的拼接方法等今天我们主要分享一下Python字符串中split方法! Python字符串中的方法有很多种,其中 ...

  7. oracle里面concat函数用法,oracle wm_concat函数用法-Oracle

    wmsys.wm_concat函数,它的作用是以','链接字符 例子如下: SQL> create table idtable (id number,name varchar2(30)); Ta ...

  8. oracle 获得月最后一天,oracle获取本月第一天和最后一天及Oracle trunc()函数的用法...

    select to_char(trunc(add_months(last_day(sysdate), -1) + 1), 'yyyy-mm-dd') "本月第一天", to_cha ...

  9. oracle里convert函数,convert函数怎么用 oracle convert函数

    SQL中的CONVE函数的用法是什么? Sql server中CONVE函数用法 格式: CONVE(data_type,expression[,style]) 说明: 此样式一般在时间类型(date ...

最新文章

  1. 有哪些堪称神器的实用网站?这8个可以解你燃眉之急!
  2. linux 守护进程管理 supervisor 简介 可用于docker容器内守护进程
  3. [致天天在园子里面喊迷茫的人们]毕业后的五年拉开大家差距的原因在哪里?[转]...
  4. [PPOPP 15] PoweSwitch: 基于同步异步切换的分布式大规模图处理系统 学习总结
  5. TCP/IP拥塞控制复习
  6. MySQL事务的可串行化
  7. 快速使用Python连接MySQL数据库的方法
  8. MySQL查询连接数
  9. leetcode403 青蛙过河
  10. uniapp小程序迁移到TS
  11. 你真的理解机器学习中偏差 - 方差之间的权衡吗?
  12. java 观察者模式_观察者模式(Observer Pattern)
  13. 江开计算机应用基础作业1答案,江苏开放大学计算机应用基础形考第二次作业答案.doc...
  14. 【网络教程】Chrome内核浏览器开启多线程下载(edge chrome)
  15. 各种编程技术资料分享
  16. 今天来聊聊CAD的“外挂”
  17. 如何提高matlab的运算速度慢,如何提高 matlab 计算速度 运算效率
  18. 关于博客笔记大汇总,持续更新迭代
  19. linux镜像文件太大不好下载_这是什么神仙系统?支持安卓程序 + Windows 程序 + Linux 程序...
  20. 蚂蚁金服Java后端(一面)面试题

热门文章

  1. C++实现基数排序(附完整源码)
  2. C++ Opengl 显示列表源码
  3. c++TCP的三次握手和四次挥手
  4. linux java top_linux top命令 监测系统性能
  5. java 中都有什么结构_java中都有哪些数据结构?
  6. mysql游标事例_MySQL游标语法实例
  7. 编写MyLayer,2 锚点,3 精灵的创建,4 zorder
  8. Hibernate优化策略
  9. DeepMedic —— 一种经典的医学图像分割的3D CNN框架
  10. JIRA7.10迁移