我正在尝试创建一个要从网络地图调用的函数(在数据库级别)。该功能使用户单击某个点时,也可以选择/突出显示关联的区域(多边形)。点和区域通过称为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;
答案 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,让我知道您是否还有其他需求。