Oracle out ref курсор в цикл

Как передать «значения» выходного курсора 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;
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
730
3

Ответы 3

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.

Можно ли добиться того же результата в той же процедуре без разделения объявление процедуры и логика цикла? Я попытался объединить их, но результат: ORA-01002: выборка вне очереди

t v 03.10.2018 23:34

нашел решение, используя выборку: 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;

t v 03.10.2018 23:50

@tv: Если вы нашли мой ответ полезным, пожалуйста, проголосуйте за него. Голоса повышают ценность ответа.

Kaushik Nayak 04.10.2018 03:48

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

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;

Идея состоит в том, что курсор динамически накапливается в виде строки, которая после этого должна использоваться в цикле! спасибо за целенаправленное решение!

t v 03.10.2018 22:47

См .: Методы агрегирования строк.

Olivier Jacot-Descombes 04.10.2018 11:30

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

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;

Другие вопросы по теме