Прежде всего, 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, дай мне знать, если тебе понадобится что-нибудь еще.