2

我试图将 SDO_GEOM.SDO_CLOSEST_POINTS 纯粹用作 sql 查询。所有示例都将它与 pl/sql 结合使用。是否可以在没有 pl/sql 的查询中使用它,任何人都可以提供一个如何执行此操作的语法示例吗?

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

http://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_objgeom.htm#SPATL1113

谢谢你。

4

1 回答 1

1

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

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

像这样的东西:

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语句中调用此函数,并像这样询问生成的对象:

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
于 2014-02-18T23:27:06.537 回答