получить из функции, возвращающей ссылку на курсор для записи - PullRequest
4 голосов
/ 10 июля 2009

У меня есть функция в пакете, которая возвращает REF CURSOR в RECORD. Я пытаюсь вызвать эту функцию из блока кода. Код вызова выглядит следующим образом:

declare      
   a_record package_name.record_name; 
   cursor c_symbols is select package_name.function_name('argument') from dual;

begin 
   open c_symbols;   
   loop            
        fetch c_symbols into a_record;
        exit when c_symbols%notfound;              
   end loop;
   close c_symbols; 
end;

Объявление функции как части имени_пакета выглядит примерно так:

TYPE record_name IS RECORD(
      field_a       varchar2(20);
);

TYPE record_cursor IS REF CURSOR RETURN record_name;

FUNCTION getsymbols(argument IN varchar2) return record_cursor;

Когда я пытаюсь запустить вызывающий блок кода, я получаю исключение: PLS-00386: обнаружено несоответствие типов в 'EXAMPLE_SYMBOLS' между курсором FETCH и переменными INTO.

Каким должен быть тип a_record и как я могу получить доступ к отдельным элементам извлекаемой записи (типа record_name)?

Ответы [ 3 ]

7 голосов
/ 11 июля 2009

Я подозреваю, что вы думаете, что ваш курсор должен извлекать строки из REFCURSOR. Это не. REFCURSOR сам по себе является курсором, для его выбора не используется другой курсор.

То, что делает ваш текущий курсор, это извлечение одной строки с одним столбцом, содержащим результат вызова функции. Это record_cursor, а не record_name, поэтому вы получаете несоответствие типов.

Я подозреваю, что вы действительно хотите сделать что-то вроде этого:

declare
  symbol_cursor  package_name.record_cursor;
  symbol_record  package_name.record_name;
begin
  symbol_cursor := package_name.function_name('argument');
  loop
    fetch symbol_cursor into symbol_record;
    exit when symbol_cursor%notfound;

    -- Do something with each record here, e.g.:
    dbms_output.put_line( symbol_record.field_a );

  end loop;

  CLOSE symbol_cursor;

end;
0 голосов
/ 10 июля 2009

Блок pl / sql для считывания курсора ref выглядит немного странно для меня. Oracle может не соответствовать типу вашего курсора c_symbols с типом package_name.record_cursor.

Предложение:

  • изменить объявление c_symbols на "c_symbols package_name.record_cursor"
  • заменить выражение "open c_symbols" на "c_symbols := package_name.function_name('argument')"

Пока вызываемая функция действительно возвращает курсор, это должно работать. Иначе, вы можете разместить фактический исходный код.

0 голосов
/ 10 июля 2009

Функция возвращает record_cursor, поэтому я ожидаю, что a_record также должно быть record_cursor. Однако непонятно, почему вы все равно возвращаете курсор ref - почему функция не может вместо этого вернуть тип record_name?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...