过程游标返回变量并循环查询

时间:2012-02-06 14:41:08

标签: oracle loops plsql cursor procedure

我对此程序有疑问。我想要做的是传入一个变量ID,然后设置一个veraible out并返回一个查询/光标。我昨天得到了一些帮助,但有些事情是不对的,也无法编译。有人可以帮我解决这个问题吗?这是我到目前为止所拥有的。

PROCEDURE SEEKER (pMonkeyID IN VARCHAR2, vMarkCounter OUT Number, seeker_cur OUT TYPES.ref_cursor)
AS
BEGIN

CURSOR seeker_cur IS
    Select monkey_doc_approved, monkey_doc_vaulted
    from monkeyApps 
    where MonkeyID = pMonkeyID
    and monkey_doc_type = 'Banana' 
    order by monkey_doc_approved_timestamp,monkey_doc_type,monkey_doc_approved desc

vMarkCounter number:=0;
BEGIN
  FOR i IN seeker_cur 
  LOOP
    vMarkCounter := vMarkCounter+1;
  END LOOP;
END;

END SEEKER;

我不确定我是否将光标设置为正确返回,我不确定我是否正确循环以设置我的monkeyMarker。光标需要返回以及标记,因为我处理两个前端逻辑。

谢谢, 弗兰克

2 个答案:

答案 0 :(得分:1)

我认为获取记录和数量都是错误的。 但如果这就是你想要的,你就可以这样做:

PROCEDURE SEEKER (pMonkeyID IN VARCHAR2, vMarkCounter OUT Number, seeker_cur OUT TYPES.ref_cursor)
AS

BEGIN

    OPEN seeker_cur for Select monkey_doc_approved, monkey_doc_vaulted 
                         from monkeyApps where MonkeyID = pMonkeyID  and monkey_doc_type = 'Banana' order by monkey_doc_approved_timestamp,monkey_doc_type,monkey_doc_approved desc;

    Select count(*) INTO vMarkCounter  from (Select monkey_doc_approved, monkey_doc_vaulted 
                         from monkeyApps where MonkeyID = pMonkeyID  and monkey_doc_type = 'Banana');


END SEEKER;

但是,请再次检查是否确实需要在获取行之前计算行数...

答案 1 :(得分:0)

我同意AB Cade我不明白为什么你需要记录和计数。但是,在PL \ SQL中,通过游标循环应该很少甚至不需要;您可以使用bulk collect来代替您想要的内容。

如果您没有那么多记录,比如少于50k,我会删除批量收集的limit 10000部分;你可以使用t_seeker.count,它会给你答案。

PROCEDURE SEEKER ( pMonkeyID IN VARCHAR2
                 , vMarkCounter OUT Number
                 , c_seeker OUT TYPES.ref_cursor) IS

  cursor c_seeker is
    select monkey_doc_approved, monkey_doc_vaulted
      from monkeyApps 
     where MonkeyID = pMonkeyID
       and monkey_doc_type = 'Banana' 
     order by monkey_doc_approved_timestamp
            , monkey_doc_type
            , monkey_doc_approved desc
           ;

  type t__seeker is table of c_seeker%rowtype index by binary_integer;
  t_seeker t__seeker;

  vMarkCounter number := 0;

begin

  open c_seeker;
  loop

     fetch c_seeker bulk collect into t_seeker limit 10000;

     vMarkCounter := vMarkCounter + t_seeker.count;

  end loop;

  -- OP want's to return a ref_cursor.
  --close c_seeker;

end seeker;
/