问题是在远程空间数据库中调用函数,其中使用了转换函数

问题描述 投票:0回答:1

我需要通过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 function package spatial dblink
1个回答
0
投票

我不是特别擅长Oracle Spatial,但我知道SDO_GEOMETRY不会在数据库链接上工作。

幸运的是,有一些解决方法,其中一个是WKT(Well Know Text),它将几何体表示为文本。您可以使用两种功能:

  • SDO_UTIL.TO_WKTGEOMETRY
  • SDO_UTIL.FROM_WKTGEOMETRY

所以 - 看看这些是否有帮助。

如需更多阅读,请查看Alex Paterson的博客,描述您还能做些什么(http://www.tolon.co.uk/2012/09/geometry-objects-across-dblink/)。

© www.soinside.com 2019 - 2024. All rights reserved.