連載 XMLツールでプログラミング(5)

OracleからXML文書を出力する

データベースの内容をXML文書として取り出したり、逆にXML文書をそのままデータベースに格納することも、XDKで可能になる。最終回となる今回は、その方法について解説しよう。

赤木伸
日本オラクル株式会社
2000/12/6

 今回は、データベースを利用してXML文書を格納/取得する方法を解説する。現在、稼働しているシステムの多くは、RDBMSを利用しているかと思う。このとき、データがリレーショナルに格納されているわけだが、このデータを使用してXML文書を作成するにはどうしたらいいのだろうか。JDBCのクラスを利用して、Oracleからデータを1つずつ取り出し、それをDOMなどを利用してXML文書を生成してもいいだろうが、大変手間がかかることが容易に想像できる。そんなときに登場するのが、Oracle XML SQL Utility for Javaだ。

(注)Oracle XML SQL Utility for Javaは、現在日本オラクルのサイトからダウンロードすることはできない。Oracle XML SQL Utility for Javaを使用する場合は、米オラクルの技術サイトであるOTN(http://technet.oracle.com/)からダウンロードする必要がある。また、11月に出荷予定のOracle8i R8.1.7には、すでにインストールされており、その時期には、日本オラクルの技術サイトOTN-J(http://technet.oracle.co.jp/)からダウンロードできるようになる予定である。

 Oracle XML SQL Utility for Javaは、データベースへの問い合わせ結果をXML文書として生成するJavaのクラス群である(図1)。文字列としてXML文書を出力することも、メモリ上にDOMの木構造として出力することもできる。また、逆にXML文書のデータをデータベースの表に書き込むこともできる。さらに、問い合わせが参照している表を基にDTDを生成することもできる。

図1 XML SQL Utility for Javaの構造

   表からデータをXML文書として出力

 では、さっそくXML SQL Utility for Javaを使用して、EMP表からデータをXML文書として取り出すプログラムを作成してみる。このEMP表は、以下のようなSQL文から生成される表だ。

CREATE TABLE EMP
(EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
  ENAME VARCHAR2(10),
  JOB VARCHAR2(9),
  MGR NUMBER(4),
  HIREDATE DATE,
  SAL NUMBER(7,2),
  COMM NUMBER(7,2),
  DEPTNO NUMBER(2));

 下のプログラムでは、このEMP表に対して「SELECT * FROM emp」という問い合わせをするSQL文をXML SQL Utilityでデータベースに問い合わせ、その結果をXML文書として出力する。

//////////////////////////////////////////////////////////
// Copyright (c) 2000
// Oracle Japan
//////////////////////////////////////////////////////////


import java.sql.*;
import oracle.xml.sql.query.*; ……… (1)
import oracle.jdbc.*;


public class XSUSample {
  public static void main(String args[]) throws SQLException {
    DriverManager.registerDriver
        (new oracle.jdbc.driver.OracleDriver());
    Connection conn =
      DriverManager.getConnection
        ("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger");


    Statement stmt = conn.createStatement();
    ResultSet rset = stmt.executeQuery("SELECT * FROM emp");


    OracleXMLQuery qry = new OracleXMLQuery(conn,rset); ……… (2)
    qry.setEncoding("Shift_JIS");
    qry.useNullAttributeIndicator(true); ……… (3)


    String xmlString = qry.getXMLString(); ……… (4)
    System.out.println(" OUPUT IS:\n"+xmlString);
  }
}

  1. 表からデータをXML文書として取り出すためにXML SQL Utilityを使用する場合には、「oracle.xml.sql.query」パッケージのクラス群をインポートする。
  2. OracleXMLQueryクラスをインスタンス化する。ここまでに、JDBCを利用して、「SELECT * FROM emp」というSQL文の検索結果がResultSetオブジェクトに格納されているので、OracleXMLQueryクラスのインスタンス化の際に、このResultSetオブジェクトをConnectionオブジェクトとともに渡す。
  3. useNullAttributeIndicator()メソッドは、列に含まれるデータがnullのときに要素として出力するかどうかを指定するメソッドである。リスト1の実行結果では、最初の行の「MGR」の列はnullだが、この例では引数に「true」を指定してあるので、
    <MGR NULL="YES" />
    と空要素として出力される。引数で「false」を指定した場合は、要素は出力されない。
  4. getXMLString()メソッドを使用することによって、クエリーの検索結果を表したXML文書を文字列として取得することができる。この際、getXMLDOM()メソッドを利用すれば、XML文書をDOM(Documentオブジェクト)として取得することもできる。

このプログラムを実行した結果は以下のようになる。

<?xml version = '1.0' encoding = 'Shift_JIS'?>
<ROWSET>
  <ROW num="1">
    <EMPNO>7355</EMPNO>
    <ENAME>大来志郎</ENAME>
    <JOB>PRESIDENT</JOB>
    <MGR NULL="YES"/>
    <HIREDATE>1/23/1981 0:0:0</HIREDATE>
    <SAL>5000</SAL>
    <COMM>2000</COMM>
    <DEPTNO>10</DEPTNO>
  </ROW>
  <ROW num="2">
    <EMPNO>7488</EMPNO>
    <ENAME>鹿子木亨紀</ENAME>
    <JOB>ANALYST</JOB>
    <MGR>7520</MGR>
    <HIREDATE>9/10/1981 0:0:0</HIREDATE>
    <SAL>500</SAL>
    <COMM NULL="YES"/>
    <DEPTNO>20</DEPTNO>
  </ROW>

… 省略 …

  <ROW num="14">
    <EMPNO>7933</EMPNO>
    <ENAME>杉田洋</ENAME>
    <JOB>SALESMAN</JOB>
    <MGR>7888</MGR>
    <HIREDATE>9/30/1982 0:0:0</HIREDATE>
    <SAL>1800</SAL>
    <COMM>1000</COMM>
    <DEPTNO>10</DEPTNO>
  </ROW>
</ROWSET>

   XML文書のデータを表に格納する

 それでは、逆にXML文書のデータをデータベースに挿入してみる。XML SQL Utilityを使用して、XML文書のデータをデータベースに挿入する場合には、そのXML文書の形式が、以下のようなフォーマットである必要がある。

<?xml version = '1.0' encoding = 'Shift_JIS'?>
<ROWSET>
  <ROW>
    <列名1>データ1</列名1>
    <列名2>データ2</列名2>
    … 省略 …
    <列名n>データn</列名n>
  </ROW>
    … 省略 …
  <ROW>
    <列名1>データ1</列名1>
    <列名2>データ2</列名2>
    … 省略 …
    <列名n>データn</列名n>
  </ROW>
</ROWSET>

 このXML文書のルート要素は、「ROWSET」である。この「ROWSET」要素は、子供の要素として「ROW」要素を持ち、<ROW>…</ROW>で囲まれた内容がデータベースの表の1行に当たる。その子供には、表の列名を要素名として、データを要素の内容(テキストノード)としたものになる。

 XML SQL Utilityで、XML文書のデータを挿入する場合、この形式のXML文書である必要があるわけだが、ほかの形式のXML文書の場合はその中に含まれるデータをデータベースに挿入することはできないのだろうか。もし、できないとすれば、大変な制限のように思える。しかし、これはXSLTを使えば簡単に解決できる。元のXML文書がどのような形式であれ、XSLTを利用して、XML SQL Utilityで挿入できる形式のXML文書に変換してしまえばいいのである。また、XSLTを使えば、XMLからXMLへの変換の際に、不要なデータを落とすこともできる。

 前回は、Emp.dtdというDTDを基に、XML Class Generatorを利用して、Emp.xmlというXML文書を作成した。このXML文書はまさに、XML SQL Utilityでデータベースに挿入できるような形式のXML文書になっているので、このEmp.xmlのデータをデータベースに格納することにする。

 下記のプログラムでは、Emp.xmlをXML SQL Utilityを利用して、EMP表に3行挿入している。XML SQL Utilityは、各要素のすべての属性を無視するので、今回の「ROW」要素の「num」という属性は実際には必要ではない。

//////////////////////////////////////////////////////////
// Copyright (c) 2000
// Oracle Japan
//////////////////////////////////////////////////////////


import oracle.xml.sql.dml.*;
import java.sql.*;
import java.io.*;


public class EmpInsert {
  public static void main(String args[])
      throws SQLException, IOException {
    DriverManager.registerDriver
        (new oracle.jdbc.driver.OracleDriver());


    // JDBC接続を初期化
    Connection cn =
      DriverManager.getConnection
          ("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger");


    // XML文書のデータを表に格納
    OracleXMLSave save = new OracleXMLSave(cn, "EMP"); ……… (1)
    InputStream is = new FileInputStream("Emp.xml");
    int rowCount = save.insertXML(is); ……… (2)


    System.out.println(" successfully inserted "+rowCount+
        " rows into EMP");
    cn.close();
  }
}

 XML文書のデータを挿入する場合は、OracleXMLSaveクラスを使用する。ここでは、挿入する対象のEMP表を指定してインスタンス化している。

  1. XML文書のファイルを読み込み、データをinsertXML()メソッドでデータベースに格納する。このinsertXML()メソッドは、挿入した行数を返すので、これを保存しておき、後で出力している。
  2. XML文書の形式があらかじめできていれば、たったこれだけのコードでXML文書内のデータをデータベースに格納することができる。もし、ほかの形式のXML文書の場合は、XML Parserのクラスを利用して、XSLスタイルシートを適用する部分を追加してから、同じ処理をすればよい。

 このように、Oracle XML SQL Utility for Javaを利用することで、大変容易にデータベースとXMLを連携させたアプリケーションを作成できる。

 さて、5回にわたってXMLを利用するためのツールとしてXDKを解説してきた。この連載を読んで、少しでもXDKを使ってみようと思っていただけたら大変うれしい。

Index
連載 XMLツールでプログラミング
  (1)Javaで利用するXML開発ツール
Oracle XML Developer's Kit(XDK)の紹介
  (2)DOMによるXML文書の操作
DOM APIを使ったプログラムの基礎
  (3) SAXによるXML文書の操作
SAX APIを使ったXML文書操作の基礎と実践
  (4) Javaで文書作成クラスを生成する
DTDを元に、XML文書を作成するJavaクラスを作る
(5) OracleからXML文書を出力する
データベースへの問い合わせ結果をXML文書にする

 



XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間