当前位置: 代码迷 >> Oracle技术 >> 请教个管道化表函数的用法
  详细解决方案

请教个管道化表函数的用法

热度:346   发布时间:2016-04-24 08:41:27.0
请问个管道化表函数的用法。
我在函数FT_DEAL_TIME中返回一个管道化表。
但是在这个管道化表函数中需要获取管道化表自身中的最后一行,如果跟当前列表某个字段比较为true则添加到管道化表,否则不添加。
我的做法是:
用max取最后那一条,可是不行报错哎(max那行),管道化表函数不会用,求指导。

代码如下:

SQL code
create or replace function FT_DEAL_TIME(iMucid number)  return Time_Data_METADATA_Table  PIPELINED is  v_time_data_metadata Time_Data_METADATA;  nowdate              date;  predate              date;begin  for x in (select f.positiontime as positiontime,                   e.longitude    as longitude,                   e.latitude     as latitude,                   f.velocity     as velocity              from BMPS_HIS_RECEIVE_GPSSTATUS d,                   BMPS_HIS_RECEIVE_GPSJPINFO e,                   BMPS_HIS_RECEIVE_GPSINFO   f             where d.sequence = f.sequence               and e.sequence = f.sequence               and d.status14 = 1               and d.mcuid = iMucid             order by d.positiontime asc) loop    nowdate := x.positiontime;    predate := select max(t.positiontime) from table(FT_DEAL_TIME(iMucid)) t;;    if (nowdate - predate) * 24 * 60 > 5 then      v_time_data_metadata := Time_Data_METADATA(x.positiontime,                                                 x.longitude,                                                 x.latitude,                                                 x.velocity);      pipe row(v_time_data_metadata);    end if;  end loop;  return;end;


------解决方案--------------------
Time_Data_METADATA_Table 的声明部分呢?
Time_Data_METADATA的声明部分呢?

从代码本身看出来问题,猜测问题出在你的TYPE定义部分。
------解决方案--------------------
predate := select max(t.positiontime) from table(FT_DEAL_TIME(iMucid)) t;;
是这行出错吧?
------解决方案--------------------
用的用法有问题,先理清需求吧。你在定义这个函数的位置又引用这个函数,这个可不大对。

------解决方案--------------------
要下班了,我帮你理下需求吧。

你的需求:但是在这个管道化表函数中需要获取管道化表自身中的最后一行,如果跟当前列表某个字段比较为true则添加到管道化表,否则不添加。

我的猜测:当前循环过程中,当前记录的positiontime列,与已加入管道中的历史数据中的最大值(也就是最后一条记录的positiontime)比较,差值如果大于5分钟,则将当前记录加入管道。

推荐的算法如下:
SQL code
create or replace function FT_DEAL_TIME(iMucid number)  return Time_Data_METADATA_Table  PIPELINED is  v_time_data_metadata Time_Data_METADATA;  nowdate              date;  predate              date;begin  for x in (select f.positiontime as positiontime,                   e.longitude    as longitude,                   e.latitude     as latitude,                   f.velocity     as velocity              from BMPS_HIS_RECEIVE_GPSSTATUS d,                   BMPS_HIS_RECEIVE_GPSJPINFO e,                   BMPS_HIS_RECEIVE_GPSINFO   f             where d.sequence = f.sequence               and e.sequence = f.sequence               and d.status14 = 1               and d.mcuid = iMucid             order by d.positiontime asc) loop    nowdate := x.positiontime;    --predate := select max(t.positiontime) from table(FT_DEAL_TIME(iMucid)) t;        -- 下面的判断条件得加上第一条记录时predate is null的判断    if predate is null or (nowdate - predate) * 24 * 60 > 5 then      v_time_data_metadata := Time_Data_METADATA(x.positiontime,                                                 x.longitude,                                                 x.latitude,                                                 x.velocity);      pipe row(v_time_data_metadata);      -- 记录前一条记录的时间      predate := nowdate();    end if;  end loop;  return;end;
------解决方案--------------------
跟踪维护最大值就行了.
if predate is null or predate < nowdate then
predate := nowdate;
end if;
  相关解决方案