2014-02-18 34 views

回答

1

從SQL查詢中調用PL/SQL過程是不可能的。

我建議你創建一個從SDO_GEOM.SDO_CLOSEST_POINTS包裹OUT參數,然後定義調用返回的對象類型的實例的過程你自己的PL/SQL功能的Oracle對象類型。

事情是這樣的:

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 
+0

感謝本,即回答了我的問題並顯着提高了我對pl/sql語法和用法的理解。 – Alexander