我需要通过dblink从“经典”数据库中检索“空间”数据库中的坐标(x,y)。
这是我的Oracle版本:Oracle Database 11g企业版版本11.2.0.4.0 - 64位生产
2数据库之间的dblink工作正常。
我在Spatial数据库中创建了一个函数,它获取了一个对象的SGO_GEOMETRY并返回通过dblink正常工作的sdo_point.x =>
现在我需要在另一个空间单元中转换当前的x。为此,我使用
MDSYS.SDO_CS.transform
如果在Spatial数据库中运行该函数,它可以正常工作。如果我通过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;
如果我从“无空间”数据库运行它,它工作正常:
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是PUBLIC。所以我尝试了MDSYS.SOD_CS包中的另一个函数,它可以工作:
w_test:= MDSYS.SDO_CS.tfm_axis_orientation_to_wkt('test');返回1;
只有使用MDSYS.SDO_GEOMETRY参数的函数似乎失败了。
你知道为什么和应该做什么?
谢谢,赫克托耳
我不是特别擅长Oracle Spatial,但我知道SDO_GEOMETRY不会在数据库链接上工作。
幸运的是,有一些解决方法,其中一个是WKT(Well Know Text),它将几何体表示为文本。您可以使用两种功能:
所以 - 看看这些是否有帮助。
如需更多阅读,请查看Alex Paterson的博客,描述您还能做些什么(http://www.tolon.co.uk/2012/09/geometry-objects-across-dblink/)。