Проблема с вызовом функции в удаленной пространственной базе данных, в которой используется функция преобразования

#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. Всегда пожалуйста. Если я вас правильно понял, вам удалось решить проблему. Если да, я рад, что вы это сделали.