1

在 .NET 数据表中,列是对象类型,它可以包含数据表作为列的有效类型。所以你可以创建一个相当复杂的结构:

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;

这不起作用,但有什么办法可以做我想做的事情吗?目前,我必须在一次调用数据库中取回公司列表,然后遍历所有记录并进行单独调用以获取每个订单列表。

[添加了有效答案 - 直到现在还没有真正回答问题的答案]

4

3 回答 3

1

虽然类型Object如您所说,.Net 确实尝试使用更多强类型的值。这些列具有关联的 DataType 属性,该属性仅支持较小的一组类型。有关完整列表,请参阅此链接:http:
//msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype.aspx

由于数据表在后台是 xml,因此您可能可以构建这样的表,但 .Net 不会将其传递给数据库。相反,您应该考虑使用 DataSet。DataSet 只是 DataTables 的集合,但它还支持可以根据需要映射关系的模式。

于 2009-01-21T17:30:25.690 回答
1

我需要做一次类似的事情,最后将它们全部返回为 OUT REF CURSOR,每个结果集一个。如果愿意,可以将其加载到 DataSet 中。

于 2009-01-21T17:35:10.020 回答
0

我在很久以前(几个月前)问过这个问题,然后当我没有得到对我有用的回复时,我回到发送多个数据表并在应用程序端以它需要的方式“重新组装”它们要处理。但是,我找到了这个问题的答案,不得不在这里与社区分享。Oracle 从版本 9 开始对 XML 的支持绝对令人难以置信,特别是 DBMS_XMLQuery 包可用于解决我上面列出的问题,方法是将 select 语句解析并作为 XML 数据集发送回,该数据集可以通过 .NET 在应用程序端轻松转换毫不费力。这是我最近编写的测试存储过程中的示例代码:

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 包还有很多其他功能。绝对值得一试。

于 2009-03-25T13:35:41.003 回答