Oracle函数返回包含在where子句中的表

时间:2011-12-06 14:42:21

标签: oracle plsql

我想创建一个返回结果表的函数。像

这样的东西
select * from address where zipcode in (f_zips_in_radius(45.123,-93.123,50));

我一直在研究这个功能,但没有任何工作,所以会排除我的尝试,以免混淆问题。

假设有可能,我将如何实施?

2 个答案:

答案 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子句可能非常昂贵,你可能必须实现结果集。或者做一些聪明的技巧....

另外我猜你必须将它投入表格......