Как закрыть возвращаемый курсор в PL / SQL? - PullRequest
6 голосов
/ 25 мая 2011

Я новичок в PL / SQL и только что получил курсоры в процессе обучения.Я видел параметры хранимой процедуры с типом OUT SYS_REFCURSOR, который, насколько я понимаю, ее целью является «возврат данных», как указатель на языке Си.Мне было интересно, кто собирается закрыть такой параметр SYS_REFCURSOR, если процедура должна открыть его и не может закрыть его?(Если процедура закрывает out OUT SYS_REFCURSOR, тогда не будет никаких данных для возврата).

Кроме того, я думаю, что это плохой дизайн - полагаться на внешние функции, отличные от хранимой процедуры, содержащей OUT SYS_REFCURSOR параметр для закрытия курсора.Есть ли способ вернуть таблицу из хранимой процедуры без использования курсоров?

1 Ответ

11 голосов
/ 25 мая 2011

Все, что вам нужно сделать, это нажать ЗАКРЫТЬ на курсор, когда вы закончите с ним, независимо от того, где он был фактически открыт:

-- A function to return a SYS_REFCURSOR
CREATE OR REPLACE FUNCTION f_c RETURN SYS_REFCURSOR IS
    cur SYS_REFCURSOR;
BEGIN
    OPEN cur FOR SELECT LEVEL FROM dual CONNECT BY LEVEL < 10;
    RETURN cur; 
END;

Вот пример прогона:

DECLARE
  cc SYS_REFCURSOR;
  r  VARCHAR2(10);
BEGIN
  cc := f_c;         -- Get the cursor from the function
  LOOP
    FETCH cc INTO r;
    EXIT WHEN cc%NOTFOUND;
    dbms_output.put_line('Output is: '||r);
  END LOOP;
  CLOSE cc;          -- Close the SYS_REFCURSOR returned from the function
END;
/

Output is: 1
Output is: 2
Output is: 3
Output is: 4
Output is: 5
Output is: 6
Output is: 7
Output is: 8
Output is: 9

Что касается возврата набора значений из функции или процедуры, вот еще один ТАК вопрос по теме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...