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