postgres - ОШИБКА: оператор не существует - PullRequest
2 голосов
/ 19 апреля 2010

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

Query failed: ERROR: operator does not exist: point <@> point HINT: No operator matches the given name and argument type(s). You may need to add explicit type casts.

Запрос такой:

BEGIN; SELECT zip_proximity_sum('zc',                                                                                                                                                                  
    (SELECT g.lat FROM geocoded g                                                                                                                                                                              
    LEFT JOIN masterfile m ON g.recordid = m.id                                                                                                                                                                
    WHERE m.zip = '10050' ORDER BY m.id LIMIT 1),                                                                                                                                                             
    (SELECT g.lon FROM geocoded g                                                                                                                                                                              
    LEFT JOIN masterfile m ON g.recordid = m.id                                                                                                                                                                
    WHERE m.zip = '10050' ORDER BY m.id LIMIT 1),                                                                                                                                                             
    (SELECT m.zip FROM geocoded g                                                                                                                                                                              
    LEFT JOIN masterfile m ON g.recordid = m.id                                                                                                                                                                
    WHERE m.zip = '10050' ORDER BY m.id LIMIT 1)                                                                                                                                                              
    ,10);

Функция PG такова:

CREATE OR REPLACE FUNCTION zip_proximity_sum(refcursor, numeric, numeric, character, numeric)
  RETURNS refcursor AS
$BODY$ 
    BEGIN 

        OPEN $1 FOR 
            SELECT r.zip, point($2,$3) <@> point(g.lat, g.lon) AS distance
            FROM
            geocoded g LEFT JOIN masterfile r ON g.recordid = r.id 
            WHERE (geo_distance( point($2,$3),point(g.lat,g.lon)) < $5)
            ORDER BY r.zip, distance;
        RETURN $1; 
    END; 
    $BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;

Ответы [ 4 ]

3 голосов
/ 05 августа 2014

Вот точные команды:

create extension cube;
create extension earthdistance;
select (point(-0.1277,51.5073) <@> point(-74.006,40.7144)) as distance;

     distance     
------------------
 3461.10547602474
(1 row)

Обратите внимание, что points создаются с LONGITUDE FIRST . Согласно документации :

Точки принимаются как (долгота, широта), а не наоборот, потому что долгота ближе к интуитивному представлению оси x и широты к оси y.

Какой ужасный дизайн ... но так оно и есть.

2 голосов
/ 13 февраля 2014

Оператор <@> предоставляется расширением earthdistance. Вам нужно позвонить create extension earthdistance; в производственную базу данных.

1 голос
/ 19 апреля 2010

Вы уверены, что postgis был правильно установлен на онлайн-сервере?

0 голосов
/ 19 апреля 2010

Точкой ошибки является оператор выбора в вашей хранимой процедуре:

SELECT r.zip, point($2,$3) <@> point(g.lat, g.lon) AS distance
                            ^

В отмеченной позиции ожидается оператор, но ваш оператор либо не определен, либо имеет другие типы аргументов. Сам Postgres знает только операторы локализации <@ и @>. Посмотрите здесь для их объяснения.

Не могли бы вы рассказать о том, чего вы пытаетесь достичь.

...