2012-02-04 3 views
2

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

Сначала я устанавливаю мой процедурный и «в переменную»

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 и каким-то образом определить, есть ли запись, которая может быть больше одной? Если да, то как это будет работать? Есть ли преимущество в том, чтобы делать один путь над другим? Итак ... Я собираюсь Судо-код, что я пытаюсь сделать (ниже):

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; 

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

+1

Есть ли причина, по которой вы не используете COUNT() здесь? Зачем вообще цитировать? – eaolson

ответ

7

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

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; 
+0

большое спасибо! –

2

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

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 возможно (почти всегда) наиболее эффективным способом. Tom Kyte вызывает однократное выполнение LOOPs «slow-by-slow».

Смежные вопросы