записи цикла pl / sql выберите оракула plsql - PullRequest
2 голосов
/ 04 февраля 2012

У меня есть оператор выбора, который я пытаюсь зациклить и увеличить переменную в зависимости от условия оператора выбора, а затем вернуть переменную как out, чтобы я мог что-то сделать с ней в некотором внешнем коде.Я использую оракул 11g, и я вижу несколько способов сделать это ... но я не уверен, что это лучший способ.У меня есть кое-что из того, что я пытаюсь сделать ниже, но снова остановлено из-за путаницы.

Сначала я устанавливаю свой процесс и 'в переменной'

PROCEDURE SEEKER (pMonkeyID IN Number, vMarkCounter OUT Number)
AS
BEGIN

CURSOR seeker_cur IS
    Select Mokney_approved, Monkey_vaulted 
    from MonkeyBookApps 
    where MonkeyID = pMonkeyID
    and Monkey_doc_type = 'BANANA' 
    order by docu_approv_timestamp,monkey_doc_type,monkey_doc_approved desc

OPEN seeker_cur;

begin

   OPEN Seeker_cur;
   vMarkCounter := 0;

Вот часть, которую яне уверен насчетДолжен ли я выполнить цикл и затем выйти, если условие не выполняется, или я должен выполнить оператор if и каким-то образом определить, существует ли запись, которая может быть больше единицы?Если так, как это будет работать?Есть ли польза от одного способа перед другим?Итак ... Я собираюсь сделать sudo-код того, что я пытаюсь сделать (ниже):

FOR (however many records) in Seeker_cur
IF seeker_cur (not found) or (returns no records)

EXIT or (break for loop);
ELSE
LOOP

vMarkCounter := vMarkCounter + 1;

EXIT WHEN seeker_cur is out of records (somehow)
END IF;
END LOOP;

END; 
END SEEKER;

Я уверен, что есть несколько способов сделать это.Какие способы вы бы предложили?

Ответы [ 2 ]

7 голосов
/ 04 февраля 2012

почему вы не используете неявный курсор, он сам откроется и закроется:

DECLARE

CURSOR seeker_cur IS
    Select Mokney_approved, Monkey_vaulted 
    from MonkeyBookApps 
    where MonkeyID = pMonkeyID
    and Monkey_doc_type = 'BANANA' 
    order by docu_approv_timestamp,monkey_doc_type,monkey_doc_approved desc;

  vMarkCounter number:=0;

BEGIN

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

  dbms_output.put_line(vMarkCounter);
END;
2 голосов
/ 06 февраля 2012

Мне кажется, что решение вашей проблемы может быть таким простым:

SELECT COUNT(*)
INTO   l_some_local_variable
FROM   monkey_book_apps 
WHERE  monkey_id = p_monkey_id
   AND monkey_doc_type = 'BANANA';

RETURN l_some_local_variable;

Избежание циклов PL / SQL и использование простейшего возможного SQL - это (почти всегда) наиболее эффективный способ. Том Кайт называет построчное выполнение LOOP «медленным за медленным».

...