1.创建表并制作测试数据;

--创建测试表 ;
CREATE TABLE split_table (
NAME VARCHAR2(100),
ID VARCHAR2(100) );
--准备测试数据 ;
INSERT INTO split_table VALUES('aa','11,12,13,14,15');
INSERT INTO split_table VALUES('bb','aa,bb,cc,dd,');
INSERT INTO split_table VALUES('cc','1a,2c,3d,,4c,55,,');
COMMIT ; --原理 ;
SELECT * FROM TABLE(splitstr((SELECT ID FROM  split_table WHERE NAME='aa' ),',')) a ;

2.编写拆分函数 :

CREATE OR REPLACE PACKAGE PACK_SPLIT_LISTAGG IS

  TYPE RECORD_SPLIT_TABLE_TYPE IS RECORD(
V_NAME VARCHAR2(100),
V_ID VARCHAR2(100));
REC_ST RECORD_SPLIT_TABLE_TYPE;
TYPE SPLIT_TABLE_TYPE IS TABLE OF RECORD_SPLIT_TABLE_TYPE;
CURSOR CURSOR_ST IS
SELECT NAME, ID FROM SPLIT_TABLE;
FUNCTION FUN_TEST_SPLITLISTAGG RETURN SPLIT_TABLE_TYPE
PIPELINED; END PACK_SPLIT_LISTAGG;
/ CREATE OR REPLACE PACKAGE BODY PACK_SPLIT_LISTAGG IS FUNCTION FUN_TEST_SPLITLISTAGG RETURN SPLIT_TABLE_TYPE
PIPELINED AS
ROW_ST SPLIT_TABLE%ROWTYPE;
V_START NUMBER := 1;
V_INDEX NUMBER;
V_LENGTH NUMBER;
P_DELIMITER VARCHAR2(100) := ',';
BEGIN
OPEN CURSOR_ST;
LOOP
FETCH CURSOR_ST
INTO ROW_ST;
EXIT WHEN CURSOR_ST%NOTFOUND;
V_LENGTH := TO_NUMBER(LENGTH(ROW_ST.ID));
WHILE (V_START <= V_LENGTH) LOOP
V_INDEX := INSTR(ROW_ST.ID, P_DELIMITER, V_START);
IF V_INDEX = 0 THEN
REC_ST.V_NAME := ROW_ST.NAME;
REC_ST.V_ID := SUBSTR(ROW_ST.ID, V_START);
V_START := V_LENGTH + 1;
ELSE
REC_ST.V_NAME := ROW_ST.NAME;
REC_ST.V_ID := SUBSTR(ROW_ST.ID, V_START, V_INDEX - V_START);
V_START := V_INDEX + 1;
END IF;
PIPE ROW(REC_ST);
END LOOP;
V_START := 1;
END LOOP;
CLOSE CURSOR_ST;
RETURN;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE || SQLERRM);
END FUN_TEST_SPLITLISTAGG;
END PACK_SPLIT_LISTAGG;
/

3.测试代码及结果:

--测试代码 ;
SELECT * FROM TABLE(pack_split_listagg.FUN_TEST_SPLITLISTAGG);

4.谢谢 !

/* 总结:  pipelined  pipe row ();

1. 一般用于返回一个集合;record ,index_table();  nested_table(); array_table();

2.返回时一次性返回;  3.如果游标的 返回值是cur%rowtype 作为参数传递时应 应使用*(select * from )

4.因为RECODE()类型和 cursor%row类型一致 所以同3 ;  5.使用游标(weak 弱类型)没有返回值类型那么默认返回的是cur%rowtype 类型;

*/

SELECT *   FROM TABLE(FUNC_PDT_TAB(CURSOR(SELECT S.PRODUCTID  , S.PRODUCTCODE, S.PRODUCTNAME   FROM SYS_PRODUCT S   ORDER BY S.PRODUCTID)));

select * FROM sys_product ; select * FROM emp ;

select * FROM TABLE(TEST_EMP_CURSOR(CURSOR(SELECT e.empno,e.ename,e.job FROM emp e))) ;

select * FROM TABLE(TEST_EMP_CURSOR_1(CURSOR(SELECT * FROM emp e))) ; --正确的写法;

select * FROM TABLE(TEST_EMP_CURSOR_1(CURSOR(SELECT e.empno,e.ename,e.job FROM emp e))) ;--抛错!

select * FROM TABLE(TEST_EMP_CURSOR_2(CURSOR(SELECT e.empno,e.ename,e.job FROM emp e))) ;

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

PIPELINED 基础用法 :

CREATE OR REPLACE PACKAGE REFCUR_PKG IS
TYPE REFCUR_T IS REF CURSOR RETURN EMP_BAK%ROWTYPE;
TYPE OUTREC_TYP IS RECORD(
VAR_EMPNO NUMBER(6),
VAR_EMPNAME VARCHAR2(30),
VAR_MGR VARCHAR2(30));
TYPE OUTRECSET IS TABLE OF OUTREC_TYP;
FUNCTION F_TRANS(P REFCUR_T) RETURN OUTRECSET
PIPELINED;
END REFCUR_PKG;
/ CREATE OR REPLACE PACKAGE BODY REFCUR_PKG IS
FUNCTION F_TRANS(P REFCUR_T) RETURN OUTRECSET
PIPELINED IS
OUT_REC OUTREC_TYP;
IN_REC P%ROWTYPE;
BEGIN
LOOP
FETCH P
INTO IN_REC;
EXIT WHEN P%NOTFOUND;
-- first row
OUT_REC.VAR_EMPNO := IN_REC.EMPNO;
OUT_REC.VAR_ENAME := IN_REC.ENAME;
OUT_REC.VAR_MGR := IN_REC.MGR;
PIPE ROW(OUT_REC);
-- second row
OUT_REC.VAR_NUM := IN_REC.DEPTNO;
OUT_REC.VAR_CHAR1 := IN_REC.DEPTNO;
OUT_REC.VAR_CHAR2 := IN_REC.JOB;
PIPE ROW(OUT_REC);
END LOOP;
CLOSE P;
RETURN;
END;
END REFCUR_PKG;

还原 listagg/wm_concat 后的数据 pack_split_listatt ;的更多相关文章

  1. SSL/TLS/WTLS原理(密钥协商的形象化比喻:验证服务器的身份,用服务器的公钥协商加密格式,然后再加密具体的消息,TCP传递SSL处理后的数据)good

    一 前言 首先要澄清一下名字的混淆: 1 SSL(Secure Socket Layer)是netscape公司设计的主要用于web的安全传输协议.这种协议在WEB上获得了广泛的应用. 2 IETF( ...

  2. 转:SqlServer2008误操作数据(delete或者update)后恢复数据

    Sqlserver2008误操作数据(delete或者update)后恢复数据(转) 实际工作中,有时会直接在数据库中操作数据,比如对数据进行delete或者update操作,当进行这些操作的时候,如 ...

  3. PDA手持扫描资产标签,盘点完成后将数据上传到PC端,固定资产系统查看盘点结果

    固定资产管理系统介绍: 致力于研发条码技术.集成条码系统的专业性公司,针对客户的不同需求,提供一站式的企业条码系统解决方案:包括功能强大的软件系统.安全可靠的无线网络.坚固耐用的硬件系统.灵活易用的管 ...

  4. 如何用perl将表格中不同列的数据进行拼凑,然后将拼凑后的数据用“|”连接在一起

    最近写了一个perl脚本,实现的功能是将表格中其中两列的数据进行拼凑,然后将拼凑后的数据用“|”连接在一起. 表格内容如下: 员工号码 员工姓名 职位 入职日期 1001 张三 销售 1980/12/ ...

  5. SqlServer触发器判断对表操作类型(增、删、改)并将修改后的数据映射到新表

    该文章为原创,日后可能会根据实际开发经验和网友评论,进行相应地方修改,为获得最新博客动态,望在转发博客的时候注明出处. 触发器要实现的功能: (1)获取对表Table1数据操作操作类型(insert. ...

  6. input中空格后的数据不显示

    bug,input中空格后的数据不显示     昨天在修bug,有一个bug是用户修改的个人信息的地址栏,输入有空格的话,空格后面的内容存不上,而且没有报错,奇怪了,只好跟踪下. 页面上的输入框就是个 ...

  7. GDAL 遥感图像处理后的数据保存为图像文件的实现方法

    在遥感图像处理中,GDAL库不仅能读取和处理大部分的遥感图像数据,而且还能够实现图像处理后将数据保存为图像的功能. 本文就详细介绍如何将内存中的图像数据保存为.tif格式. 首先,遥感数据处理完,保存 ...

  8. opencv face-detection 代码分析 (1)人脸识别后的数据

    2014,3,16   老师的工作建议如下:   1. 与四民沟通下,把openCV这边的源代码和调用接口发给四民同时抄送给我. 2. 根据openCV的实时检测结果,实现对屏幕的调整(下周一前基本实 ...

  9. SQLSERVER中返回修改后的数据

    在公司看到同事写了个SQL2005的新特性的文章,觉得很实用,在这里和大家分享下. 这种技术主要是用到了inserted和deleted虚拟表,这两张表相信大家都很熟悉.以前我们主要是在触发器中使用. ...

随机推荐

  1. 发现环——第八届蓝桥杯C语言B组(国赛)第四题

    原创 标题:发现环 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台 电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管 ...

  2. Oracle笔记之——常用的函数及脚本

    一.oracle 常用的函数及关键字 1.集合操作 1)minus 差集 2)intersect 交集 3)UNION 并集,会去重 4)UNION ALL 并集,不去重2.事物 1)COMMIT ( ...

  3. 20155207 2006-2007-2 《Java程序设计》第3周学习总结

    20155207 2006-2007-2 <Java程序设计>第X周学习总结 教材学习内容总结 比较字符串实际字符内容是否相同,不要使用==,要使用equals() 关于类的语法问题 pu ...

  4. SRM First Problem && SRM 638 250pts NamingConvention

    NamingConvention 题意: 给一个字符串,删掉所有的'_',然后将‘_'后的第一个字符改成大写. 代码: #include<bits/stdc++.h> using name ...

  5. .NET Core单元测试之搞死开发的覆盖率统计(coverlet + ReportGenerator )

    .NET Core单元测试之搞死开发的覆盖率统计 这两天在给项目补单元测试,dalao们要求要看一下测试覆盖率 翻了一波官方test命令覆盖率倒是有支持了,然而某个更新日志里面写着 ["Su ...

  6. Entity Framework中执行Sql语句

           如果想在EF框架中执行Sql语句,其实很简单,EF里面已经提供了相关的方法(此处使用的EF为EF4.1版本).        EF中提供了两个方法,一个是执行查询的Sql语句SqlQue ...

  7. C#之Ref,Out以及TryParse()的用法

    ref和out用法很简单,我记下来也提醒自己要用更好的方式去写代码,不要让代码过于臃肿,让人看得头痛.直接写 ref:ref关键字就是让参数进行传递,但是需要初始化,而out不需要初始化参数 ref用 ...

  8. rocketmq Lock failed,MQ already started -c参数

    今天部署rocketmq集群时一台机器部署一个master 和slave,slave部署总是失败,通过查看日志显示下面的错误 java.lang.RuntimeException: Lock fail ...

  9. Selenide 阶段性总结介绍(UI自动化测试工具)

    今天给大家介绍一个比较新的UI自动化测试工具-- Selenide.确实是比较新的,国内应该还没有多少人用它.在百度和google上你只能搜到一个中文帖子简单介绍了一下.如果你想用这个工具,不可避免的 ...

  10. Jenkins配置 管理

    Jenkins配置 你可能已经看了前面几次练习了,其中我们不得不在Jenkins配置选项.下表列出了Jenkins 的各种配置选项. 因此,可以通过点击左侧菜单侧的 “Manage Jenkins”选 ...