процедурный курсор возвращает переменные и выполняет цикл запроса - PullRequest
0 голосов
/ 06 февраля 2012

У меня есть вопрос об этой процедуре. То, что я пытаюсь сделать, это передать одну переменную, которая является идентификатором, затем установить veraible и вернуть запрос / курсор. Вчера мне помогли, но что-то не так, и это не скомпилируется. Может ли кто-нибудь помочь мне разобраться с этим? Вот что у меня есть.

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. курсор должен возвращаться так же, как и маркер, потому что я имею дело с некоторой интерфейсной логикой с обоими.

Спасибо, Frank

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Я думаю, что получать как записи, так и их количество неправильно.Но если это то, что вам нужно, вы можете сделать это так:

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;

Но, опять же, проверьте, действительно ли вам нужно подсчитать строки, прежде чем вы их даже извлечете ...

0 голосов
/ 06 февраля 2012

Я согласен с AB Cade. Я не понимаю, зачем вам нужны записи и счетчик. Однако, должно быть мало или совсем не нужно циклически перемещать курсор в PL \ SQL;вместо этого вы можете использовать bulk collect, что возвращает то, что вы хотите.

Если у вас не так много записей, скажем, менее 50 КБ, я бы удалил часть 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;
/
...