我想知道如何从oracle中的stored procedure
返回一个嵌套表,以便在我的.net
客户端中使用。
基本上我使用以下格式来创建嵌套表:
TYPE changes IS RECORD(
col1 VARCHAR2(20),
col2 VARCHAR2(20),
col3 VARCHAR2(20)
);
TYPE collection is table of changes;
我用存储过程逻辑中的值填充它。
现在我想为我的.net客户端返回这些值。
我们可以尝试将嵌套表值转储到游标并返回。如果是,那么如何?
答案 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