OracleでXMLを活用する
XSQLプログラミング入門

第2回 XSQLタグの機能を使う
(3/4ページ)

     Dataを挿入または変更するときに使用するXSQLタグ
 
<xsql:dml>, <xsql:include-owa>,<xsql:insert-request>, <xsql:insert-param>

 今度は、XSQLプログラムを通してデータベースにデータを変更したり、ストアドプロシージャを呼び出す方法について説明します。

■INSERT文を実行する

  データを挿入するのには<xsql:dml>が一番手っ取り早い方法です。

データを挿入する

<?xml version='1.0' encoding="Shift_JIS"?>
<page xmlns:xsql="urn:oracle-xsql" connection="tkoyama">
  <xsql:dml>
    INSERT INTO EMP
        VALUES
        ({@p_empno}, '{@p_ename}', '{@p_job}', {@p_mgr},
        SYSDATE, {@p_sal}, {@p_comm}, {@p_deptno});
  </xsql:dml>
</page>

 このXSQLを"p_empno=1501", "p_ename=二宮博之", "p_job=Analyst", "p_mgr=50", "p_sal=3000", "p_comm=NULL", "p_deptno=30"のような引数で呼び出すことで「二宮博之」さんのレコードが入社日が本日づけで挿入できます。

■ストアドプロシージャを実行する

 また、次のようなストアドプロシージャをつくることによっても同様にデータベースに新規レコードを挿入することができます。

データを挿入するストアドプロシージャ

CREATE PROCEDURE INSERT_EMP

empno emp.empno%TYPE,
ename emp.ename%TYPE,
job emp.job%TYPE,
mgr emp.mgr%TYPE,
sal emp.sal%TYPE,
comm emp.comm%TYPE,
deptno emp.deptno%TYPE
);
IS
BEGIN
  INSERT INTO EMP
    VALUES
    ({@p_empno}, '{@p_ename}', '{@p_job}',
    {@p_mgr}, SYSDATE, {@p_sal},
    {@p_comm}, {@p_deptno});
  COMMIT;
END;
/

この場合はXSQL側で以下のようにストアドプロシージャーを呼び出します。

ストアドプロシージャの実行

<?xml version='1.0' encoding="Shift_JIS"?>
<page xmlns:xsql="urn:oracle-xsql" connection="tkoyama">
  <xsql:dml>
    INSERT_EMP
    ({@p_empno}, '{@p_ename}', '{@p_job}', {@p_mgr},
    SYSDATE, {@p_sal}, {@p_comm}, {@p_deptno});
  </xsql:dml>
</page>

 しかし、ここで疑問が残ります。どのようにしてユーザーやプログラマーはデータ挿入や更新がうまくいったことを知ればいいのでしょうか?まず、先ほどの「二宮博之」さんのレコードをもう一度挿入してみることにします。すると以下のようなエラーがでます。これをXSLT側で取り扱ってクライアント側に表示すればいいのです。

出力されたエラー

<?xml version="1.0" encoding="Shift_JIS" ?>
<page xsql-timing="250">
  <xsql-error action="xsql:dml">
    <statement>INSERT INTO EMP VALUES (1501, '二宮博之',
     'Analyst', 50, SYSDATE, 3000, NULL, 30)</statement>
    <message>ORA-00001: unique constraint
    (NEWCREW00.PK_EMP) violated</message>
</xsql-error>

 もうすこしカスタムなエラー・例外処理をしたい場合は、<xsql;include-owa>タグを使用することが必要です。このタグを使用するにあたってデータベースはOracle 8iでなければなりませんし、データース側にOWAパッケージがインストールされている必要があります(OWAとは、PL/SQLカートリッジを使用するためにデータベース側にインストールする拡張パッケージです)。

OWAパッケージを利用したストアドプロシージャ

CREATE PROCEDURE INSERT_EMP

empno emp.empno%TYPE,
ename emp.ename%TYPE,
job emp.job%TYPE,
mgr emp.mgr%TYPE,
sal emp.sal%TYPE,
comm emp.comm%TYPE,
deptno emp.deptno%TYPE
);
IS
BEGIN
INSERT INTO EMP
VALUES
({@p_empno}, '{@p_ename}', '{@p_job}', {@p_mgr}, SYSDATE, {@p_sal},
{@p_comm}, {@p_deptno});
COMMIT;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
HTP.PRINT('<custom-error>UNIQUE索引列への重複があります</custom-error>");
WHEN OTHERS THEN
HTP.PRINT("<custom-error>エラーが発生しました</custom-error>");
END;
/

 このようなPL/SQL OWAパッケージを使用したプロシージャーは、以下のようなXSQLで呼び出すことにより、UNIQUE列の重複があった場合やその他のエラーの場合にカスタマイズされたメッセージをXML文書上に出力して、その対応をXSLT側でこなせるようになります。

ストアドプロシージャを実行するXSQL文書

<?xml version='1.0' encoding="Shift_JIS"?>
  <page xmlns:xsql="urn:oracle-xsql" connection="tkoyama">
    <xsql:include-owa>
      INSERT_EMP
      ({@p_empno}, '{@p_ename}', '{@p_job}', {@p_mgr},
      SYSDATE, {@p_sal}, {@p_comm}, {@p_deptno});
    </xsql:include-owa>
  </page>

■Webフォームからデータ入力する(1)

 つぎは<xsql:insert-request>タグについてです。このタグを利用すると、Webブラウザからのデータを利用して、データをデータベースへ挿入していくことができます。

 このタグを使用するにはXSLTの知識が多少必要です。まずは、このこのタグの引数を紹介しましょう。

引数名 引数値 役割
table 表名 データベースの表の名前(ビューやシノニムでも構いません)。 この引数は必須です。
date-format 文字列 DATE型の表記を指定する引数です。詳しくはjava.text.SimpleDateFormat.をご覧になってください。
transform URL 挿入する前にXMLデータが<ROWSET><ROW>の標準型になっている必要があります。その変換をするXSLTスタイルシートを指定します。

 以下が実際に<xsql:insert-request>タグを使ったプログラム例です。

<xsql:insert-request>タグのプログラム例

<?xml version='1.0' encoding="Shift_JIS"?>
<page xmlns:xsql="urn:oracle-xsql" connection="tkoyama">
  <xsql:insert-request
      table="emp"
      transform="request-to-emp.xsl">
</page>

 引数transformには、スタイルシートが指定されていた点にお気づきでしょうか。そのスタイルシートを次に示します。

スタイルシートの例

<?xml version='1.0' encoding="Shift_JIS"?>
<ROWSET xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="1.0">
  <xsl:for-each select="request/parameters">
    <ROW>
      <EMPNO><xsl:value-of select="p_empno"/></EMPNO>
      <ENAME><xsl:value-of select="p_ename"/></ENAME>
      <JOB><xsl:value-of select="p_job"/>JOB>
      <MGR><xsl:value-of select="p_mgr"/>MGR>
      <DEPTNO><xsl:value-of select="p_deptno"/</DEPTNO>
    </ROW>
  </xs:for-each>
</ROWSET>

 この方法はPOSTメソッドでしか使用できませんので次のようなHTML文書から呼ぶのが適切です。

Webフォームの例

<html>
<body>
<form action="insert_emp2.xsql" method="post">
  empno:<input type="text" name="p_empno" size="30"><br>
  ename:<input type="text" name="p_ename" size="30"><br>
  job:<input type="text" name="p_job" size="30"><br>
  mgr:<input type="text" name="p_mgr" size="30"><br>
  deptno:<input type="text" name="p_deptno" size="30"><br>
  <input type="submit">
</form>

 このフォームから入力された内容がデータベースに挿入されるわけです。 <xsql:insert-request>タグでは、テキストフィールドやラジオボタンやプルダウ ンメニューなど自由な形式のWebフォームからデータを挿入することができます。

■Webフォームからデータを入力する(2)

 最後に<xsql:insert-param>について説明します。例えば、

<html>
<body>
  <form action="insert_emp3.xsql" method="post">
  xmlfield:<textarea name="p_xmlfield" rows="20" cols="50">
  </textarea>
  <br>
  <input type="submit">
  </form>
</body>
</html>

のようなWebフォームから、XML構造上正しいXML文書、例えば

入力するXML文書

<EMPLOYEE>
  <EMPNO>1701</EMPNO>
  <ENAME>伊東裕揮</ENAME>
  <JOB>Consultant</JOB>
  <MGR>50</MGR>
  <DEPTNO>30</DEPTNO>
</EMPLOYEE>

 のように記入し適切なXSLTファイルと組み合わせることによって

XML文書に組み合わせるXSLT

<ROWSET xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xsl:version="1.0">
  <xsl:for-each select="EMPLOYEE">
    <ROW>
      <EMPNO><xsl:value-of select="EMPNO"/></EMPNO>
      <ENAME><xsl:value-of select="ENAME"/></ENAME>
      <JOB><xsl:value-of select="JOB"/></JOB>
      <MGR><xsl:value-of select="MGR"/></MGR>
      <DEPTNO><xsl:value-of select="DEPTNO"/></DEPTNO>
    </ROW>
  </xsl:for-each>
</ROWSET>

実行するXSQLプログラム

<?xml version='1.0' encoding="Shift_JIS"?>
<page xmlns:xsql="urn:oracle-xsql" connection="tkoyama">
  <xsql:insert-param name="p_xmlfield"
  table="EMP"
  transform="field-to-rowset.xsl"/>
</page>

 レコードを挿入することができます。

 ここまでで、すべてのデータ挿入、更新に関するXSQLタグを紹介しました。次は、これ以外のタグについて紹介しましょう。


 目次 

 1ページ

 主要XSQLタグの概要
   XML形式への出力言語
 DataをDBから取り出すときに使用するXSQLタグ
   XSQLでデータベースを検索する
   引数を用いた動的な検索

 2ページ
   動的な検索も可能に
   該当レコードがないときに実行される文
   カーソルの扱い
   オブジェクトデータの取り扱い
   
 3ページ
 Dataを挿入または変更するときに使用するXSQLタグ
   INSERT文を実行する
   ストアドプロシージャを実行する
   Webフォームからデータ入力する(1)
   Webフォームからデータ入力する(2)

 4ページ
 他のXML文書やXSQL出力をインポートするタグ
 その他の便利なXSQLタグ
   HTTPパラメータを処理する
   パラメータの設定
   セッションの設定
   クッキーの設定
   スタイルシートに実行結果を渡す

「連載 XSQLプログラミング入門」

 



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

注目のテーマ

HTML5+UX 記事ランキング

本日月間