高性能PL/SQL编程经验谈三(管道表函数的使用)

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/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值