#sql #oracle
#sql #Oracle
Вопрос:
SQL> SELECT sighting_id, distance
FROM sightings
WHERE distance = SQRT(POWER(latitude -(-28),2) POWER(longitude -(151),2))
GROUP BY sighting_id, distance;
Получение ошибки PLS-306: неправильный номер или типы аргументов при вызове ‘OGC_DISTANCE’. Есть какие-нибудь идеи?
Name Null? Type
-------------- -------- --------------------------------
SIGHTING_ID NOT NULL NUMBER
SPOTTER_ID NUMBER
BIRD_ID NUMBER
LATITUDE NUMBER
LONGITUDE NUMBER
SIGHTING_DATE DATE
DESCRIPTION VARCHAR2(255)
Комментарии:
1. можете ли вы опубликовать схему таблицы «наблюдения»?
2. Привет, Эндрюс, отредактировано с помощью схемы таблицы.
3. но где находится фактический столбец «расстояние», который вы пытаетесь выбрать? 🙂
4. Пытаюсь вычислить его на основе долготы / широты и другой точки.
5. Хороший обзор здесь: docs.oracle.com/cd/E17781_01/appdev.112/e18750 /…
Ответ №1:
попробуйте использовать какое-либо другое имя для столбца ‘distance’, похоже, это какая-то внутренняя функция GEO или синоним, уже определенный в вашей базе данных Oracle. Пожалуйста, также проверьте, все ли значения широты и долготы в таблице являются допустимыми числами, а не нулевыми и т. Д.
Возможно, вам потребуется добавить некоторую оболочку coalesce() для нулевых значений широты и долготы или добавить «И широта НЕ РАВНА нулю, А долгота НЕ равна НУЛЮ» в предложение WHERE .
Комментарии:
1. Я сомневаюсь, что проблема именно в этом. В сообщении об ошибке указано OGC_DISTANCE, а не DISTANCE. Oracle очень точен в этих вещах. Затем: имя функции можно просто использовать как имя таблицы или столбца (хотя это очень плохая практика); анализатор может четко различать их, поскольку за вызовом функции ВСЕГДА следует открытая скобка. Таким образом, даже если бы DISTANCE было именем функции, использование его в качестве имени столбца не привело бы к этой ошибке.
2. @mathguy, ваша точка зрения может быть верной в отношении функций, но я уверен, что в базе данных OP уже есть синоним ‘distance’, который Oracle пытается использовать в своем запросе, поэтому ему нужно выбрать другое имя для своего столбца distance.
3. … Правильно насчет синонимов… давайте посмотрим, что найдет OP, если он изменит псевдоним столбца.
Ответ №2:
Проблема в том, что в вашей таблице у вас нет расстояния между столбцами. Насколько я понимаю, вы хотите сделать:
SELECT sighting_id, SQRT(POWER(latitude -(-28),2) POWER(longitude -(151),2)) as distance
FROM sightings
GROUP BY sighting_id, SQRT(POWER(latitude -(-28),2) POWER(longitude -(151),2));
Комментарии:
1. проверьте комментарии, OP поместил обновленный SQL в комментарии, в тексте вопроса действительно отсутствует столбец расстояния. Но даже с помощью столбца расстояния он получает эту ошибку. Так что проблема в другом.
2. Отредактировано. Извините, group by также должна основываться на вычислениях, а не на псевдониме. Вот что я имел в виду. @LukeWoodward когда я писал, этот комментарий не загрузился. Вероятно, это было скрыто в see more comment, поэтому я не заметил
3. @andrews я заменил расстояние в группе на формулу на формулу. И я бы попробовал. Теперь вообще нет ссылки на расстояние. Просто псевдоним.
4. Спасибо Kacper и всем участникам. Ошибка OGC поставила меня в тупик. С нетерпением жду возможности улучшить свои навыки в SQL и внести свой вклад в сообщество. Спасибо.