我想创建一个返回结果表的函数。像Oracle函数返回where子句中包含的表
select * from address where zipcode in (f_zips_in_radius(45.123,-93.123,50));
我一直在这个功能,但没有任何工作,所以将排除我的企图,以免混淆问题。
假设这是可能的,我将如何实现它?
我想创建一个返回结果表的函数。像Oracle函数返回where子句中包含的表
select * from address where zipcode in (f_zips_in_radius(45.123,-93.123,50));
我一直在这个功能,但没有任何工作,所以将排除我的企图,以免混淆问题。
假设这是可能的,我将如何实现它?
评论的组合让我回答这个问题。感谢@a_horse_with_no_name和@Ray特里
这是我最后的解决方案
CREATE OR REPLACE PACKAGE pkg_distance AS
TYPE vcharset_t IS TABLE OF VARCHAR2(20);
FUNCTION zips_in_radius(i_lat number, i_lon number, i_radius NUMBER) RETURN vcharset_t PIPELINED;
END;
/
CREATE OR REPLACE PACKAGE BODY pkg_distance AS
FUNCTION zips_in_radius(i_lat number, i_lon number, i_radius NUMBER) RETURN vcharset_t PIPELINED IS
BEGIN
for r in (
select zipcode from zipdata z where f_distance(i_lat, i_lon, z.lat, z.lon) <= i_radius
)
loop
pipe row (r.zipcode);
end loop;
return;
END;
END;
然后使用它我使用的查询,如:
--Boston City Centered on 42.360637,-71.0587120
select * from address a
where substr(a.zipcode,1,5) in
(select * from TABLE(pkg_distance.zips_in_radius(42.360637,-71.0587120,60)))
这在我看来仍然有一个额外的“ select * from TABLE(“for my comfort,but still Managable。
问题是邮编可以是任何东西,所以如果你像一个号码对待,那么它变得更容易。您必须计算x和y之间的每个可能的排列,然后将其传回。
因为我不知道你的应用程序和你的情况,你可以期待多少结果?由于该条款可以是非常昂贵的,你可能需要做的物化结果集。还是做了一些巧妙的技巧....
而且我猜你必须铸造成一个表这个...
上面的例子不是特定于这个问题,我会照顾在实际实施中规范化邮编。 – Lloyd
可能的帮助在这里:http://geertverhoeven.blogspot.com/2007/07/create-function-tha t-returns-table.html –
查看本手册:http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/tuning.htm#i53109 –
查看SO问题[数据库:流水线功能]( http://stackoverflow.com/q/2889057/) – user272735