我想创建一个返回结果表的函数。像
这样的东西select * from address where zipcode in (f_zips_in_radius(45.123,-93.123,50));
我一直在研究这个功能,但没有任何工作,所以会排除我的尝试,以免混淆问题。
假设有可能,我将如何实施?
答案 0 :(得分:2)
评论的组合引导我回答这个问题。谢谢@a_horse_with_no_name和@Ray Toal
这是我的最终解决方案
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)))
在我看来,还有一个额外的“选择*来自TABLE(”为了我的安慰,但仍然可以管理。
答案 1 :(得分:0)
问题是zipcode可以是任何东西,所以如果你像对待一个数字那么它会变得更容易。您必须计算x和y之间的每个可能的排列,然后将其传回。
由于我不知道您的应用和您的案例,您可以期待多少结果?因为in子句可能非常昂贵,你可能必须实现结果集。或者做一些聪明的技巧....
另外我猜你必须将它投入表格......