Функция Oracle для возврата таблицы, включенной в предложение where - PullRequest
0 голосов
/ 06 декабря 2011

Я хотел бы создать функцию, которая возвращает таблицу результатов.Что-то вроде

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

Я работал над этой функцией, но у меня ничего не работает, поэтому я исключу мои попытки, чтобы не запутать вопрос.

Предполагая, что это возможно,Как бы я это реализовал?

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Комбинация комментариев приводит меня к этому ответу.Спасибо @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)))

, который в моемМнение все еще имеет дополнительный " выбор * из таблицы (" для моего удобства, но все еще управляемый.

0 голосов
/ 06 декабря 2011

Проблема в том, что почтовый индекс может быть любым, поэтому, если вы рассматриваете его как число, это становится проще. Вы должны вычислить каждую возможную перестановку между x и y и затем передать ее обратно.

Так как я не знаю ваше приложение и ваше дело, сколько результатов вы можете ожидать? Потому что это в предложении может быть очень дорогостоящим, и вам, возможно, придется материализовать набор результатов .. Или сделать несколько хитрых трюков ....

Кроме того, я полагаю, вы должны отлить это в стол ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...