Как передать «значения» выходного курсора o_cur в следующий цикл?
CREATE OR REPLACE PROCEDURE dyn_cursor (o_cur OUT SYS_REFCURSOR)
IS
script VARCHAR2 (4000);
BEGIN
script := 'select sysdate-1 notnow, sysdate today from dual union all select sysdate+1 notnow, sysdate today from dual';
OPEN o_cur FOR script;
-- the question is related to this block:
for i in o_cur
loop
DBMS_OUTPUT.PUT_LINE(i.notnow);
end loop;
-----------------------
END;





FETCH обычно обрабатывается вне процедуры, когда рефкурсором является переменная OUT.
CREATE OR REPLACE PROCEDURE dyn_cursor (o_cur OUT SYS_REFCURSOR)
IS
script VARCHAR2 (4000);
BEGIN
script := 'select sysdate-1 notnow, sysdate today from dual union all select sysdate+1 notnow, sysdate today from dual';
OPEN o_cur FOR script;
END;
/
SET SERVEROUTPUT ON
DECLARE
v_cur SYS_REFCURSOR;
v_notnow DATE;
v_today DATE;
BEGIN
dyn_cursor(v_cur);
LOOP
FETCH v_cur INTO
v_notnow,
v_today;
EXIT WHEN v_cur%notfound;
dbms_output.put_line(v_notnow);
END LOOP;
END;
/
02-10-18
04-10-18
PL/SQL procedure successfully completed.
нашел решение, используя выборку: type array is table of VARCHAR2(20) index by binary_integer; l_datapoint1 array; l_datapoint2 array; ... LOOP FETCH o_cur bulk collect into l_datapoint1, l_datapoint2 limit l_limit; for i in 1 .. l_datapoint1.count loop DBMS_OUTPUT.PUT_LINE( l_datapoint1(i) || ', ' || l_datapoint2(i) ); end loop; exit when o_cur%notfound; end loop; close o_cur;
@tv: Если вы нашли мой ответ полезным, пожалуйста, проголосуйте за него. Голоса повышают ценность ответа.
Это кажется странной конструкцией. Я бы создал представление, которое можно было повторно использовать в разных местах.
CREATE OR REPLACE VIEW VW_Times AS
SELECT sysdate-1 notnow, sysdate today FROM dual
UNION ALL
SELECT sysdate+1 notnow, sysdate today FROM dual;
а также
CREATE OR REPLACE PROCEDURE OutputTime ()
IS
CURSOR o_cur IS
SELECT * FROM VW_Times;
BEGIN
FOR i IN o_cur
LOOP
DBMS_OUTPUT.PUT_LINE(i.notnow);
END LOOP;
END;
Идея состоит в том, что курсор динамически накапливается в виде строки, которая после этого должна использоваться в цикле! спасибо за целенаправленное решение!
См .: Методы агрегирования строк.
Танки к посту Кошик Наяк, нашел приемлемое решение:
CREATE OR REPLACE PROCEDURE dyn_cursor (o_cur OUT SYS_REFCURSOR)
IS
script VARCHAR2 (4000);
type array is table of VARCHAR2(20) index by binary_integer;
l_datapoint1 array;
l_datapoint2 array;
BEGIN
script := 'select sysdate-1 notnow, sysdate today from dual union all select sysdate+1 notnow, sysdate today from dual';
OPEN o_cur FOR script;
LOOP
FETCH o_cur bulk collect into l_datapoint1, l_datapoint2;
for i in 1 .. l_datapoint1.count
loop
DBMS_OUTPUT.PUT_LINE( l_datapoint1(i) || ', ' || l_datapoint2(i) );
end loop;
exit when o_cur%notfound;
end loop;
close o_cur;
END;
Можно ли добиться того же результата в той же процедуре без разделения объявление процедуры и логика цикла? Я попытался объединить их, но результат: ORA-01002: выборка вне очереди