ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

Oracle XSQLについて

XSQLページと、XSQLサーブレット

 インターネットでは、Webサーバを使って、いろいろな形式の情報交換が、行われています。 開発者は、SQL,XML,XSLTなどの標準的な技術を使って解決することを必要としています。

 SQLは、データベースをアクセスする方法としては、よく知られています。 XMLは、SQLの問い合わせた結果をデータ交換するための、データです。 XMLは、業界標準で、プラットフォームに依存しないフォーマットです。 XSLTは、XMLを目的のXML,HTML,テキストデータに変換するための標準的な方法です。 SQLと、XMLとHTMLとXSLTを合わせると、HTTPプロトコルを使った転送手段がそのまま使えます。

 XSQLページは簡単に作成できます。 XMLファイルを作成できる、テキストエディタがあれば十分です。

 <xsql:query>タグを記述すると、そこにテンプレートで作成されたXMLデータが入ります。
 <?xml-stylesheet?>タグを記述することにより、XSLTを使ってスタイルシートを適用できます。 ファイルを保存し、ブラウザから、そのURLを指定すると、すぐに結果が見れます。

XSQLページの機能

機能 説明
<xsql:query> 階層構造を含んだXMLデータを生成
<xsql:dml> DML文を実行
<xsql:stylesheet-param> XSLTスタイルシートのパラメータ指定
<xsql:insert-request> XMLやHTMLフォームの内容を挿入
<xsql:include-xml> 指定したURLのXMLデータをインクルード
<xsql:include-request-params> HTTPのパラメータのようにセッション変数とクッキー値をXSQLに設定
<xsql:include-xsql> 別のXSQLの結果をインクルード
<xsql:include-owa> OWA(Oracle Web Agent)パッケージのストアードプロシジャを実行した結果をインクルード
<xsql:action> Javaで作成されたユーザ定義アクションを実行

SQLで階層構造のXMLデータを生成

 今まで、<xsql:query>を使った例を示してきたが、フラットなXMLデータしか扱っていません。 フラットとは、各カラムの中には、スカラーデータしか含まないデータです。 構造を持ったカラムのデータはありません。

 構造を持ったカラムには、以下の3つのタイプがあります。 ただし、ユーザ定義オブジェクトやユーザ定義コレクションは、オブジェクトオプション付きのOracle8 Enterprise Editionが必要です。

  1. ユーザ定義オブジェクトとして、明示的に定義したもの
  2. ユーザ定義コレクションとして、明示的に定義したもの
  3. SQL文の集まりからなるもの

 Oracle XML SQL Utility for Javaでは、これらの組み合わせをサポートしています。 従って、これらの機能を使えば、無料で、SQL文から、階層的なXMLデータを取得することができます。
 以下に、2つの例を示します。

ユーザ定義オブジェクトを使う方法の例

 Oracle8iのオブジェクト機能が使えるならば、以下のコマンドで、POINTという名前のユーザ定義オブジェクト型を作成します。  この機能を使うには、オブジェクトオプション付きのOracle8 Enterprise Editionが必要です。

CREATE TYPE POINT AS OBJECT (X NUMBER, Y NUMBER);

 次に、POINTオブジェクト型をORIGINカラムとしてLOCATION表にDDL文を使って、追加します。

CREATE TABLE LOCATION (
  NAME   VARCHAR2(80),
  ORIGIN POINT
);

 次に、LOCATION表に、INSERT文を使って、POINT構造を以下のようにして追加します。

INSERT INTO LOCATION VALUES ( 'Someplace', POINT(11,17) );
COMMIT;

 そして、LOCATION表から取得するために、point.xsqlというXSQLページを作成します。

point.xsql
<xsql:query connection="demo" xmlns:xsql="urn:oracle-xsql">
  SELECT name, origin
    FROM location loc
   WHERE loc.origin.x = {@x-coord}
</xsql:query>

 ブラウザから、以下のようにURLを指定します。

unix# lynx http://localhost/demo/point.xsql?x-coord=11

 すると、以下のようなXMLデータを取得することができます。

<ROWSET>
   <ROW num="1">
      <NAME>Someplace</NAME>
      <ORIGIN>
         <X>11</X>
         <Y>17</Y>
      </ORIGIN>
   </ROW>
</ROWSET>

階層化されたカラムをアクセスするためのカーソルを使う方法の例

 事前に構造を定義しておく、オブジェクトオプションが使えない場合、カーソルを使った操作で階層化されたカラムをアクセスできます。  ただし、問い合わせたカラムが階層構造であることを認識して処理する必要があります。

 例としてよく知られているDEPT表やEMP表を使って説明します。 DEPT表やEMP表の構造は以下のようになっています。

unix# sqlplus scott/tiger

SQL> desc DEPT
 Name                  Null?    Type
 --------------------- -------- ------------------
 DEPTNO                NOT NULL NUMBER(2)
 DNAME                          VARCHAR2(14)
 LOC                            VARCHAR2(13)

SQL> desc EMP
 Name                  Null?    Type
 --------------------- -------- ------------------
 EMPNO                 NOT NULL NUMBER(4)
 ENAME                          VARCHAR2(10)
 JOB                            VARCHAR2(9)
 MGR                            NUMBER(4)
 HIREDATE                       DATE
 SAL                            NUMBER(7,2)
 COMM                           NUMBER(7,2)
 DEPTNO                         NUMBER(2)

 以下のempdept.xsqlというXSQLページで、XMLデータを取得できます。

empdept.xsql
<xsql:query connection="demo" xmlns:xsql="urn:oracle-xsql">
  SELECT dname,
    CURSOR(SELECT ename,sal
           FROM emp
           WHERE emp.deptno = dept.deptno) as employees
  FROM dept
  WHERE deptno = {@department}
</xsql:query>

 ブラウザから、以下のようにURLを指定します。

unix# lynx http://localhost/demo/empdept.xsql?department=10

 すると、以下のようなXMLデータを取得することができます。

<?xml version = '1.0'?>
<ROWSET>
   <ROW num="1">
      <DNAME>ACCOUNTING</DNAME>
      <EMPLOYEES>
         <EMPLOYEES_ROW num="1">
            <ENAME>CLARK</ENAME>
            <SAL>2450</SAL>
         </EMPLOYEES_ROW>
         <EMPLOYEES_ROW num="2">
            <ENAME>KING</ENAME>
            <SAL>5000</SAL>
         </EMPLOYEES_ROW>
         <EMPLOYEES_ROW num="3">
            <ENAME>MILLER</ENAME>
            <SAL>1300</SAL>
         </EMPLOYEES_ROW>
      </EMPLOYEES>
   </ROW>
</ROWSET>

 SQLPLUSでは、以下のようになります。

unix# sqlplus scott/tiger

SQL> SELECT dname,
  2    CURSOR(SELECT ename,sal
  3           FROM emp
  4           WHERE emp.deptno = dept.deptno) as employees
  5  FROM dept
  6  WHERE deptno = 10;

DNAME          EMPLOYEES
-------------- --------------------
ACCOUNTING     CURSOR STATEMENT : 2

CURSOR STATEMENT : 2

ENAME             SAL
---------- ----------
CLARK            2450
KING             5000
MILLER           1300

関連リンク

 XSQL環境の構築方法などについてまとめてあります。



Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp