インターネットでは、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: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で作成されたユーザ定義アクションを実行 |
今まで、<xsql:query>を使った例を示してきたが、フラットなXMLデータしか扱っていません。 フラットとは、各カラムの中には、スカラーデータしか含まないデータです。 構造を持ったカラムのデータはありません。
構造を持ったカラムには、以下の3つのタイプがあります。 ただし、ユーザ定義オブジェクトやユーザ定義コレクションは、オブジェクトオプション付きのOracle8 Enterprise Editionが必要です。
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環境の構築方法などについてまとめてあります。