PL/SQL 在过程中返回记录

Posted

技术标签:

【中文标题】PL/SQL 在过程中返回记录【英文标题】:PL/SQL return record in procedure 【发布时间】:2017-04-06 10:29:51 【问题描述】:

我有一个名为“gps_coord”的程序。它需要两个参数并且必须返回记录。但我不知道我该怎么做。在此先感谢;)

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;

【问题讨论】:

记录类型必须在过程外声明... @ammoQ 是对的,在您的情况下,您有一个独立的过程,要使用记录类型作为参数,它必须在模式级别声明。 请看this问答。 同上...如果你把你的过程放在一个包中,你可以在包规范中声明记录类型。 对不起,有点错误,我记得不能是模式级别的记录,如上所述在包规范中声明或作为模式级别的对象类型。 【参考方案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;

【讨论】:

谢谢@AvrajitRoy ;) 我可以问问题吗?我还有另一个问题。当我测试我的程序时,它显示错误:“Variant conversion error for value v_x”。你能帮助我吗 ?提前致谢 您传递给程序的输入是什么? v_x=40.889786 和 v_y=45.994247【参考方案2】:
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;

【讨论】:

以上是关于PL/SQL 在过程中返回记录的主要内容,如果未能解决你的问题,请参考以下文章

通知调用方不存在记录的 DML PL/SQL 过程

Oracle Pl/sql 从多个查询中返回一个游标

PL/SQL 过程未返回预期结果

如何在 pl/sql 过程中使用游标返回多行和多列?

从 PL/SQL 中的过程返回值数组

带有参数的 PL/SQL 过程/函数从选择查询返回表