oracle out ref курсор в цикле - PullRequest
       15

oracle out ref курсор в цикле

0 голосов
/ 03 октября 2018

Как передать «значения» выходного курсора 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;

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Это кажется странной конструкцией.Я бы создал вид, который вы можете использовать в разных местах.

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;
0 голосов
/ 04 октября 2018

Танки к посту Каушик Наяк , я нашел приемлемое решение:

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;
0 голосов
/ 03 октября 2018

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...