首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用SDO_GEOM.SDO_CLOSEST_POINTS作为Oracle的查询

如何使用SDO_GEOM.SDO_CLOSEST_POINTS作为Oracle的查询
EN

Stack Overflow用户
提问于 2014-02-18 16:59:18
回答 1查看 1.6K关注 0票数 2

我试图将SDO_GEOM.SDO_CLOSEST_POINTS纯粹用作一个sql查询。所有示例都将它与pl/sql结合使用。在没有pl/sql的查询中可以使用它吗?谁能提供一个如何这样做的语法示例?

我的具体任务是试图返回最接近点的直线上的顶点。

objgeom.htm#SPATL1113

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-18 23:27:06

不可能从SQL查询调用PL/SQL过程。

我建议您创建一个object类型,它封装来自SDO_GEOM.SDO_CLOSEST_POINTSSDO_GEOM.SDO_CLOSEST_POINTS参数,然后定义自己的PL/SQL函数,该函数调用返回对象类型实例的过程。

就像这样:

代码语言:javascript
复制
CREATE TYPE closest_points_type AS OBJECT (
  dist NUMBER
, geoma mdsys.sdo_geometry
, geomb mdsys.sdo_geometry
)
/

CREATE FUNCTION sdo_closest_points_sql (
  p_geom1     IN sdo_geometry
, p_geom2     IN sdo_geometry
, p_tolerance IN NUMBER
, p_unit      IN VARCHAR2
)
RETURN closest_points_type
IS

  l_dist  NUMBER;
  l_geoma mdsys.sdo_geometry;
  l_geomb mdsys.sdo_geometry;

BEGIN

  sdo_geom.sdo_closest_points(
    geom1     => p_geom1
  , geom2     => p_geom2
  , tolerance => p_tolerance
  , unit      => p_unit
  , dist      => l_dist
  , geoma     => l_geoma
  , geomb     => l_geomb
  );

  RETURN closest_points_type(l_dist, l_geoma, l_geomb);

END sdo_closest_points_sql;
/

然后,您应该能够从一个SELECT语句调用这个函数,并询问结果对象,如下所示:

代码语言:javascript
复制
WITH q1 AS (
  SELECT
    sdo_closest_points_sql(
      mdsys.sdo_geometry(2002, NULL, NULL, sdo_elem_info_array(1,2,1), sdo_ordinate_array(1,1, 1,10, 1,20))
    , mdsys.sdo_geometry(2002, NULL, NULL, sdo_elem_info_array(1,2,1), sdo_ordinate_array(2,5, 2,15, 2,25))
    , 0.05
    , NULL
    ) result
  FROM dual
)
SELECT 
  (q1.result).dist dist
, (q1.result).geoma geoma
, (q1.result).geomb geomb
FROM q1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21860406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档