#oracle #function #package #spatial #dblink
#Oracle #функция #пакет #пространственный #dblink
Вопрос:
Мне нужно получить координаты (x, y) в «пространственной» базе данных из «классической» базы данных через dblink.
вот моя версия Oracle: Oracle Database 11g Enterprise Edition Выпуск 11.2.0.4.0 — 64-разрядная версия
dblink между базой данных 2 работает нормально.
Я создал функцию в пространственной базе данных, которая получает SGO_GEOMETRY объекта и возвращает sdo_point.x => это отлично работает через dblink
Теперь мне нужно преобразовать текущий x в другую пространственную единицу. для этого я использую
MDSYS.SDO_CS.transform
Это работает нормально, если запустить функцию в пространственной базе данных. Происходит сбой, если я вызываю функцию через dblink.
вот моя функция в пространственной базе данных:
FUNCTION TEST_GEOMETRY
(
p_compteur E_COMPTEUR_ABONNE.numero_reel%type
)
return number is
w_geometry MDSYS.SDO_GEOMETRY;
w_geometry_transformed MDSYS.SDO_GEOMETRY;
begin
begin
select geometry into w_geometry from E_COMPTEUR_ABONNE where numero_reel = p_compteur;
EXCEPTION WHEN no_data_found then return null; -- Compteur non trouvée
end;
return w_geometry.sdo_point.x;
end TEST_GEOMETRY;
если я запускаю ее из базы данных «none spatial», она работает нормально:
select test.test_geometry@elyx('09P010650') from dual;
результат: 1711071,438
Теперь я заменяю return w_geometry.sdo_point.x;
Автор:
w_geometry_transformed :=MDSYS.SDO_CS.transform(w_geometry,4326);
return w_geometry_transformed.sdo_point.x;
он отлично работает, если я запускаю его в пространственной базе данных.
Я получил это через DBLINK:
Ваше соединение с базой данных было сброшено. Все ожидающие транзакции или состояние сеанса были потеряны.
Сначала я подумал, что у моего пользователя DBLINK отсутствует какая-то авторизация, но MDSYS является ОБЩЕДОСТУПНЫМ. Итак, я попробовал другую функцию из пакета MDSYS.SOD_CS, и она работает:
w_test := MDSYS.SDO_CS.tfm_axis_orientation_to_wkt(‘test’); возвращает 1;
похоже, не удалось выполнить только функции, использующие параметры MDSYS.SDO_GEOMETRY.
У вас есть идея, почему и что нужно сделать?
Ответ №1:
Я не особенно хорош в Oracle Spatial, но я знаю, что SDO_GEOMETRY просто не будет работать по ссылке на базу данных.
К счастью, есть несколько обходных путей, одним из которых является WKT (Well Know Text), который представляет геометрию в виде текста. Вы можете использовать две функции:
- SDO_UTIL.TO_WKTGEOMETRY
- SDO_UTIL.FROM_WKTGEOMETRY
итак, посмотрим, могут ли они помочь.
Для получения дополнительной информации загляните в блог Алекса Патерсона, описывающий, что еще вы могли бы сделать (http://www.tolon.co.uk/2012/09/geometry-objects-across-dblink /).
Комментарии:
1. Привет. Спасибо вам за ваш ответ. Я понимаю, что вы не можете использовать Spatial objet через dblink, и есть те обходные пути, которые вы предлагаете. Но в моем случае я позволяю пространственной базе данных выполнять эту работу. Я извлекаю числа (x или y) только через dblink. я могу сделать «return w_geometry.sdo_point.x;». Поэтому я использую пространственные данные.
2. Всегда пожалуйста. Если я вас правильно понял, вам удалось решить проблему. Если да, я рад, что вы это сделали.