Как вернуть курсор, заполненный типом NESTED RECORD, из процедуры Oracle - PullRequest
2 голосов
/ 16 января 2012

Мне нужно вернуть курсор из процедуры Oracle, курсор должен содержать типы RECORD.Я знаю, как решить эту проблему, когда ЗАПИСЬ проста, но как это можно решить для NESTED RECORDS ?

Существует рабочий блок кода для простой записи:

-- create package with a RECORD type
create or replace package pkg as
    -- a record contains only one simple attribute
    type t_rec is RECORD (
        simple_attr number
    );
end;
/

-- create a testing procedure
-- it returns a cursor populated with pkg.t_rec records
create or replace procedure test_it(ret OUT SYS_REFCURSOR) is
    type cur_t is ref cursor return pkg.t_rec;
    cur cur_t;
begin
    -- this is critical; it is easy to populate simple RECORD type,
    -- because select result is mapped transparently to the RECORD elements
    open cur for select 1 from dual;
    ret := cur;  -- assign the cursor to the OUT parameter
end;
/

-- and now test it
-- it will print one number (1) to the output
declare
    refcur SYS_REFCURSOR;
    r pkg.t_rec;
begin
    -- call a procedure to initialize cursor
    test_it(refcur);
    -- print out cursor elements
    loop
        fetch refcur into r;
        exit when refcur%notfound; 
        dbms_output.put_line(r.simple_attr);
    end loop;  
    close refcur;
end;
/

Можете ли вы показать мне, , как это можно сделать, когда RECORD t_rec содержит NESTED RECORD ?

Измените пример следующим образом:

-- create package with a NESTED RECORD type
create or replace package pkg as
    type t_rec_nested is RECORD (
        nested_attr number
    );
    -- a record with NESTED RECORD 
    type t_rec is RECORD (
        simple_attr number,
        nested_rec t_rec_nested
    );
end;
/

create or replace procedure test_it(ret OUT SYS_REFCURSOR) is
    type cur_t is ref cursor return pkg.t_rec;
    cur cur_t;
begin
    -- how to populate a result?
    open cur for ????
    ret := cur;
end;
/

Вопрос в том, как изменить процедуру test_it для заполнения курсора?Я потратил много часов на поиски решения, я буду признателен за любую помощь.

1 Ответ

1 голос
/ 16 января 2012

Я не думаю, что это возможно, поскольку у вас это есть, поскольку записи являются типом данных PL / SQL.Вы можете сделать эквивалентную вещь, сделав объект.Если вы прокрутите вниз до этой ссылки (или выполните поиск «Обновление строки с использованием записи, содержащей объект: пример» на странице), вы увидите, как это обрабатывается.

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