3管道表函数
输入数据表----处理1---处理2----处理3-----输出数据表
管道表的好处呢,是不用等前一步的处理全部结束就可以接受数据,不需要中间的消耗,处理就像自动化流水线,一个数据处理完了马上就可以到下一步处理。
大家看下面的函数,下面这个函数是将输入的开始时间与结束时间转换成季度的区间,
大家也可以自己试试。Select * from table(SP_SUB_EXTENT(BEGINDATE, ENDDATE));
在这个过程中,我们使用了管道表,嗯,管道表函数,也是表函数,呵呵…。
-- CREATE TYPE ROW_DATA_TYPE AS OBJECT(BEGINDATE DATE,ENDDATE DATE);
-- CREATE TYPE TABLE_EXTENT_TYPE AS TABLE OF ROW_DATA_TYPE;
function SP_SUB_EXTENT(BEGINDATE in date, ENDDATE in date)
return TABLE_EXTENT_TYPE
pipelined is
--C1_CURSOR PKG_CURSOR.MYRCTYPE;
V ROW_DATA_TYPE;
V_Q_ENDDATE date;
V_Q_BGDATE date;
begin
----开始日期的季度最后一天
V_Q_ENDDATE := ADD_MONTHS(TRUNC(BEGINDATE, 'Q'), 3) - 1;
if V_Q_ENDDATE >= ENDDATE then
V := ROW_DATA_TYPE(BEGINDATE, ENDDATE);
pipe row(V);
else
V := ROW_DATA_TYPE(BEGINDATE, V_Q_ENDDATE);
pipe row(V);
V_Q_ENDDATE := ADD_MONTHS(TRUNC(V_Q_ENDDATE, 'Q'), 6) - 1;
V_Q_BGDATE := TRUNC(V_Q_ENDDATE, 'Q');
while V_Q_ENDDATE < ENDDATE
loop
----求出本季度第一天
V_Q_BGDATE := TRUNC(V_Q_ENDDATE, 'Q');
V := ROW_DATA_TYPE(V_Q_BGDATE, V_Q_ENDDATE);
pipe row(V);
---求出下个季度最后一天
V_Q_ENDDATE := ADD_MONTHS(TRUNC(V_Q_ENDDATE, 'Q'), 6) - 1;
end loop;
V_Q_BGDATE := TRUNC(ENDDATE, 'Q');
V := ROW_DATA_TYPE(V_Q_BGDATE, ENDDATE);
pipe row(V);
end if;
return;
end;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23754390/viewspace-697877/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23754390/viewspace-697877/