Функция для возврата курсора в PL SQL, - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть функция, которая возвращает SYS_REFCURSOR, эта функция должна вызываться из разных пакетов, и нам не нужно дублировать определение курсора в нескольких местах.

FUNCTION f_get_cur(p_date DATE, p_code VARCHAR(10)) RETURN SYS_REFCURSOR IS
  cur_s SYS_REFCURSOR;
BEGIN
  OPEN cur_s FOR
    SELECT .blah blah etc etc

  return cur_s;
END f_get_cur;

Что компилируется нормально, однако, когда я хочу использовать функцию в цикле FOR, где я обычно помещаю курсор, я получаю следующую ошибку

Ошибка: PLS-00456: элемент 'f_get_cur' не является курсором

Я пытаюсь открыть курсор так ...

FOR cc_rec IN f_get_cur(c_date, p_c_code) LOOP

Я использую неправильный тип данных? Есть ли какой-то другой способ добиться того, что я пытаюсь?

Ответы [ 2 ]

4 голосов
/ 30 апреля 2019

Вам нужно обработать возвращенный курсор по-другому; например:

SQL> create or replace FUNCTION f_get_cur(p_date DATE, p_code VARCHAR) RETURN SYS_REFCURSOR IS
  2    cur_s SYS_REFCURSOR;
  3  BEGIN
  4    OPEN cur_s FOR
  5      SELECT to_char(p_date, 'dd-mm-yyyy') || p_code val from dual;
  6
  7    return cur_s;
  8  END f_get_cur;
  9  /

Function created.

SQL> declare
  2        cur_s SYS_REFCURSOR;
  3        v     varchar2(100);
  4  begin
  5      cur_s := f_get_cur(sysdate, 'xx');
  6      loop
  7          fetch cur_s into v;
  8          exit when cur_s%NOTFOUND;
  9          dbms_output.put_line(v);
 10      end loop;
 11  end;
 12  /
30-04-2019xx

PL/SQL procedure successfully completed.

SQL>
0 голосов
/ 01 мая 2019

Мне удалось добиться этого, создав еще один (!) Курсор, который реализует функцию, которую я уже создал (которая оборачивает исходный курсор)

cursor cur_real(cp_date DATE, cd_code VARCHAR2(10)) IS
  select ... etc
FROM TABLE(f_get_cur(cp_date, cp_code));

Теперь я могу использовать курсор примерно так

FOR cc_rec IN f_get_cur(c_date, p_c_code) LOOP
   do stuff ... etc
END LOOP
...