Как закрыть возвращающийся курсор в PL / SQL?

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

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

1 ответов


все, что вам нужно сделать, это закрыть курсор, когда вы закончите с ним, независимо от того, где он был фактически открыт:

-- 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

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