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

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

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

OracleCommandクラスを使用したOracle XML DBへのアクセス

 通常の表に対してOracleCommandクラスを使用してアクセスするように、Oracle XML DBへのアクセスも可能です。まず初めに、テスト用のテーブルを作成します。

create table EMP_XMLDB of xmltype;
XMLType表の作成

「XMLType列を持つ表」と「XMLType表」の2種類を作成できます。「XMLType列を持つ表」は、通常のリレーショナル表で、その表にいくつかのXML文書を格納するための列を持っています。「XMLType表」は、オブジェクト表の1つでXMLType列を1つしか持たない表です。ただし、XMLType列を1つしか持たないリレーショナル表とは異なり、列名を明示する必要がないという特徴を持っています。今回のテスト用テーブルは非構造化ストレージです。XMLスキーマを指定する構造化ストレージに対応するには、Create Table文の最後に、XMLスキーマを指定します。構造化ストレージについては、OTNのXML Technology Centerにて詳細に説明してありますので、そちらを参照してください。

XMLTypeにXML文書を代入

 XMLTypeに対してXML文書を代入するには、OracleXmlTypeオブジェクトを使用し、OracleCommandクラスのParametersプロパティを使用する方法のほかに、OracleCommandクラスで発行するSQL文中にXML文書を直接記述することも可能です。リスト1、リスト2はParametersプロパティを使用した場合のコードです。

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

Dim sb As StringBuilder = New StringBuilder
sb.Append("<EMP>")
sb.Append("<EMPNO>7370</EMPNO>")
sb.Append("<ENAME>田中太郎</ENAME>")
sb.Append("<JOB>社員</JOB>")
sb.Append("<HIREDATE>1998-02-14</HIREDATE>")
sb.Append("<SAL>300000</SAL>")
sb.Append("<DEPTNO>10</DEPTNO>")
sb.Append("</EMP>")

Dim xml As OracleXmlType = _
  New OracleXmlType(cnn, sb.ToString())
Dim cmd As OracleCommand = New OracleCommand("", cnn)
cmd.CommandText = "INSERT INTO EMP_XMLDB VALUES (:1)"
cmd.CommandType = CommandType.Text

Dim p1 As OracleXmlType = _
  New OracleXmlType(cnn, sb.ToString())
cmd.Parameters.Add(":1", OracleDbType.XmlType, p1, _
  ParameterDirection.Input)

cmd.ExecuteNonQuery()
リスト1 XMLTypeにXML文書をパラメータとして渡すコード(VB.NET)

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

StringBuilder sb = new StringBuilder();
sb.Append("<EMP>");
sb.Append("<EMPNO>7370</EMPNO>");
sb.Append("<ENAME>田中太郎</ENAME>");
sb.Append("<JOB>社員</JOB>");
sb.Append("<HIREDATE>1998-02-14</HIREDATE>");
sb.Append("<SAL>300000</SAL>");
sb.Append("<DEPTNO>10</DEPTNO>");
sb.Append("</EMP>");

OracleXmlType xml = 
  new OracleXmlType(cnn, sb.ToString());
OracleCommand cmd = new OracleCommand("", cnn);
cmd.CommandText = "INSERT INTO EMP_XMLDB VALUES (:1)";
cmd.CommandType = CommandType.Text;

OracleXmlType p1 = new OracleXmlType(cnn, sb.ToString());
cmd.Parameters.Add(":1", OracleDbType.XmlType,
                   p1, ParameterDirection.Input);

cmd.ExecuteNonQuery();
リスト2 XMLTypeにXML文書をパラメータとして渡すコード(C#)

XMLTypeからXML文書を取得

 XMLTypeからXML文書を取得する際にも、OracleXmlTypeオブジェクトを使用します。OracleDataReaderクラスのGetOracleXmlTypeメソッドを使用します。

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 * FROM EMP_XMLDB"
Dim rdr As OracleDataReader = cmd.ExecuteReader()
Dim EmpXML As OracleXmlType

If rdr.Read() Then
  EmpXML = rdr.GetOracleXmlType(0)
  ' XMLの処理……
End If
リスト3 XMLTypeから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 * FROM EMP_XMLDB";
OracleDataReader rdr = cmd.ExecuteReader();
OracleXmlType EmpXML;

if(rdr.Read()){
  EmpXML = rdr.GetOracleXmlType(0);
  // XMLの処理……
}
リスト4 XMLTypeからXML文書を取得するコード(C#)

XMLTypeの更新

 XMLTypeを更新する方法には、OracleXmlTypeオブジェクトのUpdateメソッドを使用する方法と、.NET Frameworkで提供されているXmlDocumentクラスにXML文書を格納してから更新する方法の2つがあります。OracleXmlTypeオブジェクトのUpdateメソッドを使用する場合、以下のようなコードになります。

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 * FROM EMP_XMLDB"
Dim rdr As OracleDataReader = cmd.ExecuteReader()
Dim EmpXML As OracleXmlType

If rdr.Read() Then
  EmpXML = rdr.GetOracleXmlType(0)
  EmpXML.Update("/EMP/ENAME/text()", String.Empty, _
   "鈴木太郎")
  cmd.CommandText = _
  "Update EMP_XMLDB Set SYS_NC_ROWINFO$=:1"
  cmd.Parameters.Add(":1", OracleDbType.XmlType, EmpXML, _
    ParameterDirection.Input)
  cmd.ExecuteNonQuery()
End If
リスト5 OracleXmlTypeを操作して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 * FROM EMP_XMLDB";
OracleDataReader rdr = cmd.ExecuteReader();
OracleXmlType EmpXML;

if(rdr.Read())
{
  EmpXML = rdr.GetOracleXmlType(0);
  EmpXML.Update("/EMP/ENAME/text()", String.Empty, 
                "鈴木太郎");

  cmd.CommandText =
   "Update EMP_XMLDB Set SYS_NC_ROWINFO$=:1";
  cmd.Parameters.Add(":1", OracleDbType.XmlType, EmpXML, 
                     ParameterDirection.Input);
  cmd.ExecuteNonQuery();
}
リスト6 OracleXmlTypeを操作してXML文書を更新するコード(C#)

 XmlDocumentクラスに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 * FROM EMP_XMLDB"
Dim rdr As OracleDataReader = cmd.ExecuteReader()
Dim EmpXML As OracleXmlType

If rdr.Read() Then
  EmpXML = rdr.GetOracleXmlType(0)
  Dim xdoc As XmlDocument = EmpXML.GetXmlDocument()
  xdoc.SelectSingleNode("/EMP/ENAME").InnerText = "鈴木太郎"
  Dim EmpXMLUpd As New OracleXmlType(cnn, xdoc)

  cmd.CommandText = "Update EMP_XMLDB Set SYS_NC_ROWINFO$=:1"
  cmd.Parameters.Add(":1", OracleDbType.XmlType, EmpXMLUpd, _
    ParameterDirection.Input)
  cmd.ExecuteNonQuery()
End If
リスト7 OracleXmlTypeとXmlDocumentを利用して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 * FROM EMP_XMLDB";
OracleDataReader rdr = cmd.ExecuteReader();
OracleXmlType EmpXML;

if(rdr.Read())
{
  EmpXML = rdr.GetOracleXmlType(0);
  XmlDocument xdoc = EmpXML.GetXmlDocument();
  xdoc.SelectSingleNode("/EMP/ENAME").InnerText = "鈴木太郎";
  OracleXmlType EmpXMLUpd = new OracleXmlType(cnn, xdoc);

  cmd.CommandText = 
   "Update EMP_XMLDB Set SYS_NC_ROWINFO$=:1";
  cmd.Parameters.Add(":1", OracleDbType.XmlType, EmpXMLUpd, 
                     ParameterDirection.Input);
  cmd.ExecuteNonQuery();
}
リスト8 OracleXmlTypeとXmlDocumentを利用してXML文書を更新するコード(C#)

次ページへ続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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