2017-04-06 71 views
0

我有一個叫做「gps_coord」的程序。它需要兩個參數並且必須返回記錄。但我不知道我該怎麼做。在此先感謝;)程序中的PL/SQL返回記錄

CREATE OR REPLACE PROCEDURE gps_coord(v_x IN FLOAT, 
             v_y IN FLOAT, v_result out result_type) 
IS 
TYPE result_type IS RECORD(
    v_km VARCHAR2(50), 
    v_objID VARCHAR2(50) 
); 

v_out result_type; 
BEGIN 


select P.KM , P.OBJECTID INTO v_out from SDE.POINTS p where  sde.st_intersects(P.SHAPE,sde.st_buffer(sde.st_transform(sde.st_point(v_y,v_x,4326),32639) ,5000))=1; 
dbms_output.put_line('km: ' || v_out.v_km || 'objid: ' || v_out.v_objID); 
END; 
+0

記錄類型必須在程序之外聲明... –

+0

@ammoQ是正確的,你的情況,你有一個獨立的程序,使用記錄類型作爲參數,它必須在架構級別聲明。 – Seyran

+0

請看[this](http://stackoverflow.com/questions/13225532/is-it-possible-to-use-return-in-stored-procedure)問題與解答。 –

回答

1

試試這個。希望能幫助到你。

--Object type creation 
CREATE OR REPLACE TYPE result_type 
IS 
    OBJECT 
    (
    v_km VARCHAR2(50), 
    v_objID VARCHAR2(50)); 

--Table type 
CREATE OR REPLACE type result_tab 
IS 
    TABLE OF result_type; 

    --Procedure creation and out the collection 
CREATE OR REPLACE 
PROCEDURE gps_coord(
    v_x IN FLOAT, 
    v_y IN FLOAT, 
    v_result OUT result_tab) 
AS 
    v_out result_tab; 
BEGIN 
    SELECT result_type(P.KM , P.OBJECTID) BULK COLLECT 
    INTO v_out 
    FROM SDE.POINTS p 
    WHERE sde.st_intersects(P.SHAPE,sde.st_buffer(sde.st_transform(sde.st_point(v_y,v_x,4326),32639) ,5000))=1; 
    FOR i IN v_out.FIRST..v_out.LAST 
    LOOP 
    dbms_output.put_line(v_out(i).v_km||' '||v_out(i).v_objID); 
    END LOOP; 
END; 
+0

謝謝@AvrajitRoy;)我可以問問題嗎?我有另一個問題。當我測試我的過程時,它顯示錯誤:「值v_x的變體轉換錯誤」。你可以幫我嗎 ?在此先感謝 –

+0

您傳遞給過程的輸入是什麼? –

+0

v_x = 40.889786和v_y = 45.994247 –

1
CREATE OR REPLACE TYPE result_type IS OBJECT 
(
    v_km NVARCHAR2(50), 
    v_objID NVARCHAR2(50) 
) 


CREATE OR REPLACE PROCEDURE gps_coord(v_x IN NVARCHAR2, v_y IN NVARCHAR2, v_result out result_type) 
IS 
    BEGIN 
    select P.KM , P.OBJECTID INTO v_result.v_km , v_result.v_objID from SDE.POINTS p where sde.st_intersects(P.SHAPE,sde.st_buffer(sde.st_transform(sde.st_point(v_y,v_x,4326),32639) ,5000))=1; 
    end;