Курсор зацикливания выдает ошибку, что курсор не определен - PullRequest
1 голос
/ 19 апреля 2020

Я хочу l oop результатов из хранимой процедуры. Мой код:

set serveroutput on
VAR c_curs refcursor;

EXECUTE pck_prov.get_value_type_list(1, :c_curs);


BEGIN
    FOR record_test IN c_curs LOOP
        dbms_output.put_line(record_test.id);
    END LOOP;
END;

Я не понимаю, почему возникает ошибка, которая должна быть объявлена ​​c_curs:

Ошибка запуска в строке: 7 в команде - BEGIN

FOR record_test IN c_curs LOOP

    dbms_output.put_line(record_test.id);

END LOOP; 

END;
Отчет об ошибке -

ORA-06550: строка 2, столбец 24:

PLS-00201: идентификатор 'C_CURS' должен быть объявлен

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Курсор может быть ссылкой в ​​блоке PL / SQL следующим образом:

set serveroutput on    
DECLARE
  c_curs    SYS_REFCURSOR;
  v_id      NUMBER;
BEGIN

  pck_prov.get_value_type_list (1, c_curs); --> procedure called here

  LOOP 
    FETCH c_curs
    INTO  v_id;
    EXIT WHEN c_curs%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(v_id);
  END LOOP;
  CLOSE c_curs;
END;
/
1 голос
/ 19 апреля 2020

c_curs является переменной связывания и не является переменной, определенной в PL / SQL. Чтобы использовать его в блоке PL / SQL, вам необходимо поставить перед ним двоеточие :, чтобы указать, что вы используете переменную связывания (точно так же, как вы делали это в операторе EXECUTE):

set serveroutput on
VAR c_curs refcursor;

EXECUTE pck_prov.get_value_type_list(1, :c_curs);


BEGIN
    FOR record_test IN :c_curs LOOP
        dbms_output.put_line(record_test.id);
    END LOOP;
END;
...