Ошибка функции Oracle: ORA-00932: несовместимые типы данных: ожидается, что CHAR получил MDSYS.SDO.GEOMETRY - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь создать функцию (на уровне базы данных), которая должна вызываться с веб-карты. Функция заключается в том, чтобы, когда пользователь щелкает точку, соответствующая область (многоугольник) также выделяется / выделяется. Точки и регионы связаны на уровне атрибута через значение в столбце с именем code (например, не пространственно).

Я создал приведенный ниже код, но он возвращает ошибку:

ORA-00932: несовместимые типы данных: ожидаемый CHAR MDSYS.SDO_GEOMETRY (?)

Код:

create or replace function region_select 
  ( 
      p_geom in sdo_geometry   
  )  

RETURN SDO_GEOMETRY
DETERMINISTIC

IS 
  v_pointId number;
  v_code number;
  geom_out sdo_geometry;

BEGIN

select point_id into v_pointId from points where geom = p_geom;
select code into v_code from points where point_id = v_pointId;


    if (v_pointId is not null)
    then
    select geom into geom_out from regions where code  = v_code;
    RETURN geom_out;
    end if;

-- error handling
exception
when others then
    raise_application_error(-20001,'An error was encountered - '|| 
sqlcode ||' -error- '|| sqlerrm);
    rollback;
end;

1 Ответ

0 голосов
/ 29 мая 2019

Прежде всего, where geom = p_geom показывает, что пространственное выделение используется (не для РЕГИОНОВ, а для ТОЧЕК) - и вы не можете проверить геометрическое равенство, используя where geom = p_geom. Вы должны использовать select point_id into v_pointId from points t where SDO_EQUALS(t.geom,p_geom) = 'TRUE' - это предполагает, что для POINTS.geom существует пространственный индекс. Если у вас не может быть пространственного индекса, а таблица POINTS действительно мала, вы можете использовать where sdo_geom.relate(t.geom,'determine',p_geom)='EQUAL' - но это будет медленно ...

Во-вторых, я согласен с @Alex Poole в том, что такая обработка ошибок не только бессмысленна, но и вредна. Как написано, вы получите ошибку (которую вы получили бы в любом случае без исключения), но вы потеряете, например. , где произошла эта ошибка. Сначала вы должны избавиться от него, запустить код и посмотреть, получите ли вы лучшее описание ошибки (CHAR MDSYS.SDO_GEOMETRY? Что такое "CHAR"? В какой строке?). Если то, что вы получаете, не проливает больше света, мы здесь, чтобы помочь ...

Кстати, я не уверен, что эта функция действительно ДЕТЕРМИНИСТИЧЕСКАЯ - вы должны убедиться, что она есть (и зачем объявлять ее как таковую? Какова цель здесь?). Наконец, лучше всего объявлять переменные геометрии как "MDSYS.SDO_GEOMETRY", а не просто "SDO_GEOMETRY" - старые ошибки могут вернуться, чтобы укусить вас ...

HTH, дай мне знать, если тебе понадобится что-нибудь еще.

...