请问个管道化表函数的用法。
时间:2011-10-14
来源:互联网
但是在这个管道化表函数中需要获取管道化表自身中的最后一行,如果跟当前列表某个字段比较为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;
作者: xx_mm 发布时间: 2011-10-14
Time_Data_METADATA的声明部分呢?
从代码本身看出来问题,猜测问题出在你的TYPE定义部分。
作者: xiaobn_cn 发布时间: 2011-10-14
SQL code
CREATE OR REPLACE TYPE Time_Data_METADATA_Table as table of Time_Data_METADATA
Time_Data_METADATA:
SQL code
create or replace type Time_Data_METADATA as object ( dtPOSITIONTIME date, lLONGITUDE number, lLATITUDE number, iVelocity number )
作者: xx_mm 发布时间: 2011-10-14
作者: xx_mm 发布时间: 2011-10-14
是这行出错吧?
作者: xiaobn_cn 发布时间: 2011-10-14
predate := select max(t.positiontime) from table(FT_DEAL_TIME(iMucid)) t;;
是这行出错吧?
作者: xx_mm 发布时间: 2011-10-14
作者: xiaobn_cn 发布时间: 2011-10-14
你的需求:但是在这个管道化表函数中需要获取管道化表自身中的最后一行,如果跟当前列表某个字段比较为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;
作者: xiaobn_cn 发布时间: 2011-10-14
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28