Комбинация комментариев приводит меня к этому ответу.Спасибо @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)))
, который в моемМнение все еще имеет дополнительный " выбор * из таблицы (" для моего удобства, но все еще управляемый.