在.NET Datatable中,列是对象类型,可以包含数据表作为列的有效类型。所以你可以创建一个相当复杂的结构:
CompanyID (Integer) | CompanyName (String) | OrderRecords (DataTable)
---------------------------------------------------------------------------
1 | Acme Corp. | DataTable of Orders
调用Oracle存储过程时,有没有办法返回这样的结构。我尝试使用内联视图,但它不会让我。例如:
refCursor IS ref CURSOR;
PROCEDURE GETCOMPANYLIST (
CompanyCursor OUT refCursor
)
AS
BEGIN
Open CompanyCursor For
SELECT COMPANYID, COMPANYNAME,
(SELECT * FROM ORDERS WHERE CompanyID = CompanyID) OrderRecords
WHERE IsActive = 'T';
END GETCOMPANYLIST;
这不起作用,但有什么方法可以做我想在这里做的事情? 目前,我必须在一次调用数据库时返回公司列表,然后遍历所有记录并进行单独调用以获取每个订单列表。
[添加了有效的答案 - 直到现在还没有回答实际问题的答案]
答案 0 :(得分:1)
虽然您所说的类型为Object
,但.Net确实尝试使用更强类型的值。这些列具有关联的DataType属性,该属性仅支持较小的一组类型。有关完整列表,请参阅此链接:
http://msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype.aspx
由于数据表是xml,你可能可以构建一个这样的表,但.Net不会将它传递给数据库。相反,您应该考虑使用DataSet。 DataSet只是DataTables的集合,但它也支持可以根据需要映射关系的模式。
答案 1 :(得分:1)
我需要做一次类似的事情,并最终将它们全部作为OUT REF CURSOR返回,每个结果集一个。 如果愿意,可以将其加载到DataSet中。
答案 2 :(得分:0)
我在很久以前(几个月前)问过这个问题,然后当我没有得到对我有用的回复时,我回去发送多个数据表并在应用程序端“重新组装”它们需要处理的方式。但是,我找到了这个问题的答案,并且不得不在这里与社区分享。从版本9开始,Oracle对XML的支持是绝对令人难以置信的,特别是DBMS_XMLQuery包可以用来解决上面列出的问题,方法是将select语句解析并作为XML数据集发送回来,可以通过.NET在Application端轻松转换。毫不费力。以下是我最近编写的测试存储过程中的示例代码:
SELECT COMPANYID, COMPANYNAME,
DBMS_XMLQuery.GetXML(
'SELECT * FROM ORDERS WHERE CompanyID = '
|| COMPANY.COMPANYID )
OrderRecords
FROM COMPANY
WHERE lower(COMPANYNAME) LIKE '%shawn%';
这将返回类似下面的内容(只需将OrderRecords作为字符串拉入并转换为DataTable:
CompanyID | CompanyName | OrderRecords
---------------------------------------------------------------------------
1051 | Shawns Company | XML String Returned, listed below
<?xml version = '1.0'?>
<ROWSET>
<ROW num="1">
<ORDERID>500020</ORDERID>
<NOTES>Test Note</NOTES>
<!-- Additional fields cut out Not necessary for example -->
</ROW>
<ROW num="2">
<ORDERID>500021</ORDERID>
<NOTES>Test Note 2</NOTES>
<!-- Additional fields cut out Not necessary for example -->
</ROW>
<ROW num="3">
<ORDERID>500280</ORDERID>
<NOTES>notes test</NOTES>
<!-- Additional fields cut out Not necessary for example -->
</ROW>
<!-- Additional Rows cut out Not necessary for example -->
</ROWSET>
除了这个非常酷的功能之外,DBMS_XMLQuery包还有很多其他功能。绝对值得一试。