从存储过程返回嵌套表

时间:2016-01-04 15:22:17

标签: oracle stored-procedures plsql oracle11g plsqldeveloper

我想知道如何从oracle中的stored procedure返回一个嵌套表,以便在我的.net客户端中使用。

基本上我使用以下格式来创建嵌套表:

TYPE changes IS RECORD(
    col1 VARCHAR2(20),
    col2 VARCHAR2(20),
    col3 VARCHAR2(20)
);

TYPE collection is table of changes;

我用存储过程逻辑中的值填充它。

现在我想为我的.net客户端返回这些值。
我们可以尝试将嵌套表值转储到游标并返回。如果是,那么如何?

3 个答案:

答案 0 :(得分:0)

首先,如果使用ODP.net,则知道您可以在程序和UI之间directly pass collection types。这很挑剔,但它确实有效。

如果您只想将一个集合转储到要返回的游标中,那么请查看TABLE()函数。在您的示例中,您可以使用类似的方式传回一个用于UI遍历的ref_cursor(原谅任何次要的语法故障 - 我此刻离开我的数据库):

FUNCTION collection_to_cursor
return sys_refcursor
IS
   p_cursor  sys_refcursor;
   p_change changes;
BEGIN
Open p_cursor for (
   SELECT col1, col2, col3
   FROM   TABLE(p_change));
RETURN p_cursor;
end;

答案 1 :(得分:0)

您可以使用参考光标,这是

的内容
DECLARE
lt_collection collection := collection();
lrc_collection SYS_REFCURSOR;

BEGIN

lt_collection := f_populate_collection_somehow;

OPEN lrc_collection  
SELECT col1
      ,col2
      ,col3
FROM  TABLE(CAST(lt_collection AS collection));


END;
然后,

.NET可以从引用光标中检索数据,我不确定如何完成此操作的详细信息。

有一些关于使用ref游标或关联数组的更好的信息 here

答案 2 :(得分:0)

请注意,我并不熟悉.NET,因此我正在写这个问题"如何从oracle"中的存储过程返回嵌套表。 我不确定在我的.net客户端消费""部分,因为我不确定返回的记录类型/表类型是否可以直接在.net代码中使用。

我做了一些研究,我学到的是在任何oracle客户端界面中都没有记录类型的直接支持。人们通常做的是从函数创建一个返回表类型的包装程序,将其转换为引用游标,并在自定义代码中使用引用游标。

CREATE OR REPLACE TYPE changes AS OBJECT(
    col1 VARCHAR2(20),
    col2 VARCHAR2(20),
    col3 VARCHAR2(20)
);

CREATE OR REPLACE TYPE collection is table of changes;

CREATE OR REPLACE PACKAGE test_pkg AS
  FUNCTION test_fn RETURN collection;
END test_pkg;

CREATE OR REPLACE PACKAGE BODY test_pkg
AS
  FUNCTION test_fn RETURN collection AS
  l_collection collection;
  BEGIN
    l_collection := collection();
    l_collection.EXTEND;
    l_collection(l_collection.LAST) := changes('Subhasis','Mukherjee','Male');
    RETURN l_collection;
  END test_fn;
END test_pkg;


SELECT * FROM table(test_pkg.test_fn)

col1              col2              col3
-----------       -------------     --------------
Subhasis          Mukherjee         Male