我试图将 SDO_GEOM.SDO_CLOSEST_POINTS 纯粹用作 sql 查询。所有示例都将它与 pl/sql 结合使用。是否可以在没有 pl/sql 的查询中使用它,任何人都可以提供一个如何执行此操作的语法示例吗?
我的具体任务是尝试在最接近点的线上返回顶点。
http://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_objgeom.htm#SPATL1113
谢谢你。
我试图将 SDO_GEOM.SDO_CLOSEST_POINTS 纯粹用作 sql 查询。所有示例都将它与 pl/sql 结合使用。是否可以在没有 pl/sql 的查询中使用它,任何人都可以提供一个如何执行此操作的语法示例吗?
我的具体任务是尝试在最接近点的线上返回顶点。
http://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_objgeom.htm#SPATL1113
谢谢你。
不能从 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