【问题标题】:Problem calling a function in a remote spatial database in which a transform function is used在使用变换函数的远程空间数据库中调用函数时出现问题
【发布时间】:2019-09-09 15:18:30
【问题描述】:

我需要通过 dblink 从“经典”数据库中检索“空间”数据库中的坐标 (x,y)。

这是我的 Oracle 版本: Oracle Database 11g 企业版 11.2.0.4.0 - 64 位生产

两个数据库之间的 dblink 工作正常。

我在空间数据库中创建了一个函数,它获取对象的 SGO_GEOMETRY 并返回 sdo_point.x => 通过 dblink 可以正常工作

现在我需要将当前 x 转换为另一个空间单元。 为此,我使用

MDSYS.SDO_CS.transform

如果在空间数据库中运行该函数,它工作正常。 如果我通过 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;

结果:1​​711071,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】:

    我不是特别擅长 Oracle Spatial,但我知道 SDO_GEOMETRY 无法通过数据库链接工作。

    幸运的是,有一些解决方法,其中之一是 WKT(众所周知的文本),它将几何图形表示为 文本。您可以使用两个功能:

    • SDO_UTIL.TO_WKTGEOMETRY
    • SDO_UTIL.FROM_WKTGEOMETRY

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

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

    【讨论】:

    • 嗨。谢谢您的回答。我知道您不能通过 dblink 使用 Spatial 对象,并且您提出了一些解决方法。但就我而言,我让空间数据库完成这项工作。我只通过 dblink 检索数字(x 或 y)。我可以“返回 w_geometry.sdo_point.x;”。所以我使用空间数据。
    • 不客气。如果我对您的理解正确,则您设法解决了问题。如果是这样,我很高兴你这样做了。
    猜你喜欢
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多