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;

これは機能しませんが、ここでやろうとしていることを行う方法はありますか? 現在、データベースへの 1 回の呼び出しで会社のリストを取得する必要があります。次に、すべてのレコードをループし、個々の呼び出しを行って注文の各リストを取得する必要があります。

[有効な回答を追加 - これまで、実際に質問に回答する回答はありませんでした]

4

3 に答える 3

1

型はObjectあなたの言うとおりですが、.Net はより厳密に型指定された値を使用しようとします。列には、より小さなタイプのセットのみをサポートする DataType プロパティが関連付けられています。完全なリストについては、次のリンクを参照してください:
http://msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype.aspx

データテーブルは内部で xml であるため、おそらくそのようなテーブルを作成できますが、.Net はそれをデータベースに渡しません。代わりに、DataSet の使用を検討する必要があります。DataSet は単なる DataTable のコレクションですが、必要に応じて関係をマップできるスキーマもサポートしています。

于 2009-01-21T17:30:25.690 に答える
0

比較的昔(数か月前)にこの質問をしましたが、うまくいく応答が得られなかったときは、複数のデータテーブルを送信し、アプリケーション側で必要な方法でそれらを「再アセンブル」しました。処理されます。しかし、私はこの質問に対する答えを見つけ、ここのコミュニティと共有する必要がありました。バージョン9以降のOracleの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 に答える