連載
» 2005年02月26日 00時00分 公開

ODP.NETでOracle XML DBを活用するODP.NETファーストステップ(4)(3/4 ページ)

[大田浩,日本オラクル]

OracleXmlStreamクラスでのXML文書の取得

 OracleXmlStreamクラスは、OracleXmlTypeオブジェクトに格納された読み取り専用ストリームです(以下のコードのEmpXMLはOracleXmlTypeオブジェクトです)。

Dim xmlStream As New OracleXmlStream(EmpXML)
リスト9 OracleXmlTypeクラスよりOracleXmlStreamクラスのインスタンスを生成(VB.NET)

OracleXmlStream xmlStream = new OracleXmlStream(EmpXML);
リスト10 OracleXmlTypeクラスよりOracleXmlStreamクラスのインスタンスを生成(C#)

 OracleXmlStreamクラスのReadメソッドを利用すると、指定されたデータ量を現在のXMLストリームのインスタンスから読み込み、配列バッファに移入します。Byte配列とChar配列に値を格納できます。

  • Read(byte[ ], int, int)
    このメソッドは、指定されたUnicodeのバイト数を現在のインスタンスから読み込み、ストリーム内の位置を進め、バイト配列バッファに移入します
  • Read(char[ ], int, int)
    このメソッドは、指定された文字数を現在のインスタンスから読み込み、ストリーム内の位置を進め、文字配列バッファに移入します。
OracleXmlStreamの情報は、「Oracle Data Provider for .NET開発者ガイド」にて詳細に説明してありますので、そちらを参照してください。

ExecuteXmlReaderを使用し、通常の表をXMLで取得

 XMLTypeに格納されたXML文書を取得する以外にも、通常の表をXMLで取得することが可能です。OracleCommandのXmlCommandTypeプロパティを設定し、ExecuteXmlReaderメソッドを使用することにより、通常の表をXML文書として取得できます。ExecuteXmlReaderメソッドにより取得されたXMLは.NET Frameworkで提供されている、XmlReaderクラス/XmlDocumentクラスを利用して操作可能です。

図3 通常の表をXML文書で取得 図3 通常の表をXML文書で取得

 実際のコードは以下のようになります。

Dim cnn As New OracleConnection( _
  "user id=scott;password=tiger;data source=orcl")
cnn.Open()
Dim cmd As OracleCommand = New OracleCommand("", cnn)
cmd.CommandText = _
 "SELECT empno, ename, sal, " & _
 "deptno FROM emp ORDER BY empno DESC"
cmd.XmlCommandType = OracleXmlCommandType.Query
Dim empReader As XmlReader = cmd.ExecuteXmlReader()
Dim empDoc As XmlDocument = New XmlDocument
empDoc.PreserveWhitespace = True
empDoc.Load(empReader)
Dim strXmlDoc As String = empDoc.OuterXml
リスト11 ExecuteXmlReaderメソッドを実行し通常の表をXML化するコード(VB.NET)

OracleConnection cnn = new OracleConnection(
  "user id=scott;password=tiger;data source=orcl");
cnn.Open();
OracleCommand cmd = new OracleCommand("", cnn);
cmd.CommandText =
  "SELECT empno, ename, sal, " +
  "deptno FROM emp ORDER BY empno DESC";
cmd.XmlCommandType = OracleXmlCommandType.Query;
XmlReader empReader = cmd.ExecuteXmlReader();
XmlDocument empDoc = new XmlDocument();
empDoc.PreserveWhitespace = true;
empDoc.Load(empReader);
string strXmlDoc = empDoc.OuterXml;
リスト12 ExecuteXmlReaderメソッドを実行し通常の表をXML化するコード(C#)

 上記のコードのように、XmlCommandTypeプロパティがQueryの場合に、OracleCommandクラスで使用されるXMLプロパティをOracleXmlQueryPropertiesクラスで指定可能になります。

名前 説明
MaxRows 問い合わせの結果セットで結果のXML文書として表すことができる最大行数を指定
RootTag 結果のXML文書のルート要素を指定
RowTag 結果セットから作成されたXML文書のデータの行を識別するXML要素の値を指定
Xslt XSLTを使用してXML変換に使用されるXSL文書を指定
XsltParams XSL文書のパラメータを指定
表2 OracleXmlQueryPropertiesのプロパティ

 OracleXmlQueryPropertiesクラスのXsltプロパティを指定すると、取得したXML文書とXSL文書のスタイルシートを組み合わせ、整形化しHTMLとして出力可能です。OracleXmlQueryPropertiesクラスを利用したサンプルアプリケーションは、USのOTNサイトよりダウンロードできます。

画面1 USのOTNサイトに掲載されているサンプルアプリケーション 画面1 USのOTNサイトに掲載されているサンプルアプリケーション
OracleXmlQueryPropertiesの情報は、「Oracle Data Provider for .NET開発者ガイド」にて詳細に説明してありますので、そちらを参照してください。

通常の表をOracleデータベース上でXML文書に変換し、取得する方法

 通常の表をExecuteXmlReaderを使用してXML文書に変換する方法とは別に、Oracle上でXML文書に変換した結果をOracleXmlTypeオブジェクトに格納することも可能です。以下にその手順を説明します。

CREATE OR REPLACE VIEW SCOTT.EMP_VIEW
    (SYS_NC_ROWINFO$)
AS
SELECT XMLELEMENT("EMP",
   XMLFOREST(empno, ename, job,sal,deptno)
  ) FROM emp
リスト13 emp表をXML文書に変換するビューの作成

 XML文書に変換されたビューをOracleXmlTypeに取得するコードは以下のようになります。

Dim cnn As New OracleConnection( _
  "user id=scott;password=tiger;data source=orcl")
cnn.Open()
Dim cmd As OracleCommand = New OracleCommand("", cnn)

Dim empXml As OracleXmlType
cmd.CommandText = "SELECT * FROM emp_view t " & _
 "ORDER BY EXTRACTVALUE(VALUE(t), '/EMP/EMPNO/text()') DESC"
cmd.Connection = cnn
Dim empReader As OracleDataReader = cmd.ExecuteReader()
Dim str As String = ""
While (empReader.Read())
  empXml = empReader.GetOracleXmlType(0)
  ' XMLの操作……
End While
リスト14 XML文書に変換されたビューをOracleXmlTypeに取得するコード(VB.NET)

OracleConnection cnn = new OracleConnection(
  "user id=scott;password=tiger;data source=orcl");
cnn.Open();
OracleCommand cmd = new OracleCommand("", cnn);

OracleXmlType empXml;
cmd.CommandText = "SELECT * FROM emp_view t " +
  "ORDER BY EXTRACTVALUE(VALUE(t), '/EMP/EMPNO/text()') DESC";
cmd.Connection = cnn;
OracleDataReader empReader = cmd.ExecuteReader();
while(empReader.Read()){
  empXml = empReader.GetOracleXmlType(0);
  // XMLの操作……
}
リスト15 XML文書に変換されたビューをOracleXmlTypeに取得するコード(C#)

次ページへ続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。