从游标对象的for循环返回ref_cursor

时间:2014-05-06 04:58:05

标签: plsql oracle10g sys-refcursor

我试图将一个ref_cursor分配给for循环中的变量,然后在函数结束时返回。如果结果超过1,则循环遍历本地游标。

我已经注意到代码中出现错误的位置。我不知道如何创建一个循环,我可以获得循环中当前点的ref_cursor,将其分配给变量然后将其返回到函数。有人可以帮我弄明白怎么做吗?以下是我基于google搜索阅读的第i次尝试。

错误是“PLS-00382:表达式是错误的类型”我知道我显然没有基于此错误分配正确的可变类型,但下面的代码与错误是我想要做的说明以及我需要帮助完成的事情。

FUNCTION GET_PARCEL(p_lat in number, p_long in number) return sys_refcursor 
IS
  v_distance number(10) := 100000000;
  v_shortest_dist number(10) := v_distance;
  v_centroid SDO_GEOMETRY;
  v_rc_ref_cursor sys_refcursor;
  v_ref_geom SDO_GEOMETRY :=  mdsys.SDO_GEOMETRY(2001, 8311, NULL, SDO_ELEM_INFO_ARRAY(1, 1, 1), SDO_ORDINATE_ARRAY(120.3214, -10.7088));
  cursor query_cursor is select * from PARCEL_TABLE where code = 20134;
BEGIN
  for query_row in query_cursor loop
            v_centroid := SDO_GEOM.SDO_CENTROID(query_row.geometry, 0.05);
            IF (v_centroid is not null) then    
                v_distance := SDO_GEOM.SDO_DISTANCE(v_centroid, v_ref_geom, 0.05);
                IF v_distance < v_shortest_dist THEN
                    v_shortest_dist := v_distance;
                    v_rc_ref_cursor := query_row; -- Error on this line
                END IF;
            ELSE
                DBMS_OUTPUT.PUT_LINE('Centroid is not initialised for some reason.');
            END IF; 
  end loop;

  return v_rc_ref_cursor;
END;

2 个答案:

答案 0 :(得分:0)

据我所知,你无法建立游标。游标由数据库创建和维护,具有与其源数据,事务和会话上下文等的连接。

我建议您声明一个类型,实例化它,在类型中构建值。

完成后,通过选择* from table(cast(变量为your_type))来创建游标。

将光标移动到ref_cursor并返回。

答案 1 :(得分:0)

专业提示是要记住您的表中有数据,您可以将其用于逻辑。事实证明,如果我使用我想要的行的IDENTIFIER或ROWID,那么我可以在一个由IDENTIFIER或ROWID查找的引用游标中执行where子句。

例如。

open v_rc_ref_cursor for select * from PARCEL_TABLE n where n.identifier = query_row.identifier;

超级简单的东西:)