如何从 Oracle 过程返回填充了 NESTED RECORD 类型的游标

Posted

技术标签:

【中文标题】如何从 Oracle 过程返回填充了 NESTED RECORD 类型的游标【英文标题】:How to return a cursor populated with NESTED RECORD type from Oracle procedure 【发布时间】:2012-01-16 09:34:14 【问题描述】:

我需要从 Oracle 过程中返回一个 游标,游标必须包含 RECORD 类型。当 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】:

我认为这不可能,因为 RECORD 是一种 PL/SQL 数据类型。你可以通过创建一个 OBJECT 来做同样的事情。如果您向下滚动到this link 的底部(或在页面上搜索“使用包含对象的记录更新行:示例”),您将看到它是如何处理的。

【讨论】:

是的!我不明白我怎么能错过这么明显的解决方案。非常感谢。

以上是关于如何从 Oracle 过程返回填充了 NESTED RECORD 类型的游标的主要内容,如果未能解决你的问题,请参考以下文章

当嵌套表属于记录类型时,如何将数据填充到 Oracle 中的嵌套表中

如何从 Oracle 存储过程中获取两个返回值

如何使用 SELECT 从 Oracle 存储过程中返回行?

oracle:使用 PL/sql 过程从另一个模式填充表

如何从 .NET 中的存储过程返回 oracle 输出参数

如何php调用oracle存储过程返回的是一个结果集,该怎么从php页面中吧数据循环输出呀