Как использовать запись, чтобы зациклить ref курсор? - PullRequest
2 голосов
/ 22 февраля 2012

Я хочу написать PL / SQL для тестирования функции в пакете.Пакет определяет тип курсора

TYPE ref_cursor IS REF CURSOR;

Я хочу определить запись на основе этого типа.

Мой код:

DECLARE
  cur PACKAGE_NAME.ref_cursor; 
  rec cur%ROWTYPE;

почему последняя строка неисправить?

1 Ответ

12 голосов
/ 22 февраля 2012

Вы не можете определить тип записи на основе слабо типизированного REF CURSOR. Поскольку тип курсора, определенный в пакете, можно использовать для возврата данных из произвольного запроса с произвольными столбцами, компилятор PL / SQL не может определить подходящий тип записи для извлечения данных.

Если вы знаете фактические данные, возвращаемые из функции, вы можете объявить запись такого типа для извлечения данных. Например, если я объявляю функцию, которая возвращает тип курсора со слабым типом, но я знаю, что курсор действительно возвращает курсор на основе таблицы EMP, я могу извлечь данные в запись EMP%ROWTYPE (обратите внимание, что SYS_REFCURSOR это системный тип REF CURSOR со слабым типом)

create or replace function f1
  return sys_refcursor
is
  l_rc sys_refcursor;
begin
  open l_rc
   for select *
         from emp;
  return l_rc;
end;

declare
  l_rc sys_refcursor;
  l_emp emp%rowtype;
begin
  l_rc := f1;
  loop
    fetch l_rc into l_emp;
    exit when l_rc%notfound;
    dbms_output.put_line( l_emp.empno );
  end loop;
end;
...