Oracle函数错误:ORA-00932:数据类型不一致:预期的CHAR获得了MDSYS.SDO.GEOMETRY

时间:2019-05-29 06:51:24

标签: oracle function compiler-errors oracle-spatial

我正在尝试创建一个要从网络地图调用的函数(在数据库级别)。该功能使用户单击某个点时,也可以选择/突出显示关联的区域(多边形)。点和区域通过称为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 :(得分:0)

首先,where geom = p_geom显示使用的是空间选择 (不是用于REGIONS,而是用于POINTS)-并且您无法使用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,让我知道您是否还有其他需求。