ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 高性能PL/SQL编程经验谈三(管道表函数的使用)

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

原创 Linux操作系统 作者:木呼 时间:2011-06-14 12:51:24 0 删除 编辑

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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-04-19

  • 博文量
    93
  • 访问量
    152559