2011-12-06 22 views
0

我想创建一个返回结果表的函数。像Oracle函数返回where子句中包含的表

select * from address where zipcode in (f_zips_in_radius(45.123,-93.123,50)); 

我一直在这个功能,但没有任何工作,所以将排除我的企图,以免混淆问题。

假设这是可能的,我将如何实现它?

+1

可能的帮助在这里:http://geertverhoeven.blogspot.com/2007/07/create-function-tha t-returns-table.html –

+3

查看本手册:http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/tuning.htm#i53109 –

+2

查看SO问题[数据库:流水线功能]( http://stackoverflow.com/q/2889057/) – user272735

回答

2

评论的组合让我回答这个问题。感谢@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。

0

问题是邮编可以是任何东西,所以如果你像一个号码对待,那么它变得更容易。您必须计算x和y之间的每个可能的排列,然后将其传回。

因为我不知道你的应用程序和你的情况,你可以期待多少结果?由于该条款可以是非常昂贵的,你可能需要做的物化结果集。还是做了一些巧妙的技巧....

而且我猜你必须铸造成一个表这个...

+0

上面的例子不是特定于这个问题,我会照顾在实际实施中规范化邮编。 – Lloyd