ヘッダーをスキップ
Oracle® Fusion Middleware Oracle TopLinkデータベースWebサービスによる永続性アーキテクチャの開発
12c (12.1.3)
E57541-01
  目次へ移動
目次

前
 
次
 

2 DBWSサービスの作成

この章では、EclipseLink DBWSサービスを作成する方法を説明します。

この章の内容は次のとおりです。

2.1 データベース表からのEclipseLink DBWSサービスの作成

データベース表のCRUD (Create/Read[findByPKおよびfindAll]/Update/Delete)操作を公開するWebサービスを作成できます。EclipseLinkは、これをデータベース上の表または複数の表(カタログ、スキーマまたは表名に%をサポートするパターンを使用)に対してサポートし、そのデータベースではJDBCドライバが表のメタデータをJDBCメタデータAPI(java.sql.DatabaseMetaData)を経由して確実に正確に送ります。

EclipseLinkはDBWSBuilderユーティリティを使用して、次のルールでDBWS XMLスキーマを生成します。

例2-1では、Oracleのscottデータベース・スキーマからEMP表(表2-1)を使用します。

表2-1 サンプルのEMP表

OWNER TABLE_NAME COLUMN_NAME DATA_TYPE DATA_LENGTH DATA_PRECISION DATA_SCALE NULLABLE?

SCOTT

EMP

EMPNO

NUMBER

22

4

0

N

SCOTT

EMP

ENAME

VARCHAR2

10

(null)

(null)

Y

SCOTT

EMP

JOB

VARCHAR2

9

(null)

(null)

Y

SCOTT

EMP

MGR

NUMBER

22

4

0

Y

SCOTT

EMP

HIREDATE

DATE

7

(null)

(null)

Y

SCOTT

EMP

SAL

NUMBER

22

7

2

Y

SCOTT

EMP

COMM

NUMBER

22

7

2

Y

SCOTT

EMP

DEPTNO

NUMBER

22

2

0

Y


例2-1 例

DBWSBuilderユーティリティでは、入力として次に示すようなDBWS構成ファイルが必要です。

<?xml version="1.0" encoding="UTF-8"?>
<dbws-builder xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <properties>
    <property name="projectName">emp</property>
    ... database properties
  </properties>
  <table
    catalogPattern="%"
    tableNamePattern="EMP"
  />
</dbws-builder>

DBWSBuilderを実行するには、次のコマンドを使用します。

prompt > dbwsbuilder.cmd -builderFile dbws-builder.xml -stageDir output_directory -packageAs wls emp.war
 

説明:

  • dbws-builder.xml: DBWS構成ファイル(前述のとおり)

  • output_directory: 生成されるファイルの出力ディレクトリ

  • -packageAs: Webサービスがデプロイされるプラットフォーム

DBWSBuilderで生成されたeclipselink-dbws-schema.xsdファイルは、表2-1のデータベース表のメタデータから<element-tag>名を導出します。

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  >
  <xsd:complexType name="empType">
    <xsd:sequence>
      <xsd:element name="empno" type="xsd:int" xsi:nil="false"/>
      <xsd:element name="ename" type="xsd:string" xsi:nil="true"/>
      <xsd:element name="job" type="xsd:string" xsi:nil="true"/>
      <xsd:element name="mgr" type="xsd:int" minOccurs="0" xsi:nil="true"/>
      <xsd:element name="hiredate" type="xsd:dateTime" xsi:nil="true"/>
      <xsd:element name="sal" type="xsd:decimal" xsi:nil="true"/>
      <xsd:element name="comm" type="xsd:int" minOccurs="0" xsi:nil="true"/>
      <xsd:element name="deptno" type="xsd:int" xsi:nil="true"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>
 

2.1.1 生成されたEclipseLink DBWSサービス・ディスクリプタ

生成されるEclipseLink DBWSサービス・ディスクリプタ(eclipselink-dbws.xml)・ファイルで、CRUD操作は次のように示されます。

例2-2 CRUD操作の例

<?xml version="1.0" encoding="UTF-8"?>
<dbws xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="urn:emp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <name>emp</name>
   <sessions-file>eclipselink-dbws-sessions.xml</sessions-file>
   <update>
      <name>update_empType</name>
      <parameter>
         <name>theInstance</name>
         <type>ns1:empType</type>
      </parameter>
   </update>
   <insert>
      <name>create_empType</name>
      <parameter>
         <name>theInstance</name>
         <type>ns1:empType</type>
      </parameter>
   </insert>
   <query>
      <name>findByPrimaryKey_empType</name>
      <parameter>
         <name>id</name>
         <type>xsd:decimal</type>
      </parameter>
      <result>
         <type>ns1:empType</type>
      </result>
      <named-query>
         <name>findByPrimaryKey</name>
         <descriptor>empType</descriptor>
      </named-query>
   </query>
   <delete>
      <name>delete_empType</name>
      <parameter>
         <name>theInstance</name>
         <type>ns1:empType</type>
      </parameter>
   </delete>
   <query>
      <name>findAll_empType</name>
      <result isCollection="true">
         <type>ns1:empType</type>
      </result>
      <named-query>
         <name>findAll</name>
         <descriptor>empType</descriptor>
      </named-query>
   </query>
</dbws>
 

2.1.2 SOAPメッセージ

次のSOAPメッセージによって、DBWSサービスempに対して<findAll_empType>操作を起動します。

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Body>
    <findAll_empType xmlns="urn:empService" xmlns:urn="urn:emp"/>
  </env:Body>
</env:Envelope>
 

次のように戻されます。

<?xml version="1.0" encoding="utf-16"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header />
  <SOAP-ENV:Body>
    <srvc:findAll_empTypeResponse xmlns="urn:emp" xmlns:srvc="urn:empService">
      <srvc:result>
        <empType>
          <empno>7369</empno>
          <ename>SMITH</ename>
          <job>CLERK</job>
          <mgr>7902</mgr>
          <hiredate>1980-12-17T00:00:00.0-05:00</hiredate>
          <sal>800</sal>
          <deptno>20</deptno>
        </empType>
        <empType>
          <empno>7499</empno>
          <ename>ALLEN</ename>
          <job>SALESMAN</job>
          <mgr>7698</mgr>
          <hiredate>1981-02-20T00:00:00.0-05:00</hiredate>
          <sal>1600</sal>
          <comm>300</comm>
          <deptno>30</deptno>
        </empType>
        ....
      </srvc:result>
    </srvc:findAll_empTypeResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

2.2 EclipseLink SessionCustomizerの使用

DBWSでEclipseLink SessionCustomizerを使用すると、EclipseLink APIにアクセスして、セッションからORマッピング・ディスクリプタ(object-relational)またはOXマッピング・ディスクリプタ(object-XML)を取得できます。次にディスクリプタを使用してマッピングを追加、変更または削除します。

詳細は、『Oracle TopLinkの理解』の「セッション」を参照してください。

2.2.1

この例は、EclipseLink SessionCustomizerを実装する方法を示しています。

package some.java.package;
 
import org.eclipse.persistence.config.SessionCustomizer; 
import org.eclipse.persistence.sessions.Session; 
import org.eclipse.persistence.sessions.DatabaseLogin; 
 
public class MySessionCustomizer implements SessionCustomizer {
 
  public MySessionCustomizer() {
  }
 
  public void customize(Sesssion session) { 
    DatabaseLogin login = (DatabaseLogin)session.getDatasourceLogin();
    // enable 'dirty' reads
    login.setTransactionIsolation(DatabaseLogin.TRANSACTION_READ_UNCOMMITTED); 
  } 
}
 

DBWSBuilder構成ファイルでは、次のようにorSessionCustomizerClassNameまたはoxSessionCustomizerClassNameを使用して、カスタマイズした内容がORMプロジェクトまたはORXプロジェクト(それぞれに)に適用されるかどうかを指定する必要があります。

例2-3 ORMプロジェクト

<?xml version="1.0" encoding="UTF-8"?> 
<dbws-builder xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  <properties>
    <property name="projectName">customize_test</property>
     ...
    <property name="orSessionCustomizerClassName">some.java.package.MyORSessionCustomizer</property>
 

例2-4 ORXプロジェクト

<?xml version="1.0" encoding="UTF-8"?> 
<dbws-builder xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  <properties>
    <property name="projectName">customize_test</property>
     ...
    <property name="oxSessionCustomizerClassName">some.java.package.MyOXSessionCustomizer</property>
 

2.2.2 高度なカスタマイズ

EclipseLinkの専用のproject.xmlファイルとsessions.xmlファイルを作成することで、EclipseLink DBWSサービスを高度にカスタマイズできます。任意のユーティリティを使用して、次の操作を実行します。

  • オブジェクトをEclipseLinkリレーショナル・プロジェクトのリレーショナル・データベースにマップします

  • オブジェクトをEclipseLink XMLプロジェクトのXMLスキーマにマップします

  • 両方のプロジェクトを参照するEclipseLink sessions.xmlファイルを作成します。

この方法では、リレーショナル・マッピングとXMLマッピングのすべての側面を制御することができます。この方法は、多くのまたはすべての詳細をカスタマイズしたいときに最良です。

例2-5で、DBWSサービスは、既存のEclipseLinkプロジェクト・マップから大文字小文字が区別される同一のエイリアス(プロジェクト間で共通のディスクリプタ)を使用して作成されます。

例2-5 DBWSサービスの例

<?xml version="1.0" encoding="UTF-8"?>
<object-persistence version="Eclipse Persistence Services - some version (some build date)" xmlns="http://www.eclipse.org/eclipselink/xsds/persistence" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:eclipselink="http://www.eclipse.org/eclipselink/xsds/persistence">
   <name>SomeORProject</name>
   <class-mapping-descriptors>
      <class-mapping-descriptor xsi:type="relational-class-mapping-descriptor">
         <class>some.package.SomeClass</class>
         <alias>SomeAlias</alias>
...
 

<?xml version="1.0" encoding="UTF-8"?>
<object-persistence version="Eclipse Persistence Services - some version (some build date)" xmlns="http://www.eclipse.org/eclipselink/xsds/persistence" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:eclipselink="http://www.eclipse.org/eclipselink/xsds/persistence">
   <name>SomeOXProject</name>
   <class-mapping-descriptor xsi:type="xml-class-mapping-descriptor">
      <class>some.package.SomeClass</class>
      <alias>SomeAlias</alias>
...
 

注意:

この(DBWSBuilderユーティリティを使用しない)方法でDBWSのWebサービスを構築する場合は、すべての必要なデプロイメント・アーティファクトを作成してください。


2.3 既存のEclipseLink ORMマッピングとOXMマッピング

DBWSサービスは、(プロジェクトのクラスとプロジェクトのデプロイメントXMLがサポートされた)既存のEclipseLink ORMマップとOXMマップを使用して、プロジェクト間で共通の、ディスクリプタへの大文字/小文字を区別する同一のエイリアスを使用して作成することができます。

例2-6 ORMマップの使用

<?xml version="1.0" encoding="UTF-8"?>
<object-persistence version="Eclipse Persistence Services - some version (some build date)" xmlns="http://www.eclipse.org/eclipselink/xsds/persistence" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:eclipselink="http://www.eclipse.org/eclipselink/xsds/persistence">
   <name>SomeORProject</name>
   <class-mapping-descriptors>
      <class-mapping-descriptor xsi:type="relational-class-mapping-descriptor">
         <class>some.package.SomeClass</class>
         <alias>SomeAlias</alias>
...
 

例2-7 OXMマップの使用

<?xml version="1.0" encoding="UTF-8"?>
<object-persistence version="Eclipse Persistence Services - some version (some build date)" xmlns="http://www.eclipse.org/eclipselink/xsds/persistence" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:eclipselink="http://www.eclipse.org/eclipselink/xsds/persistence">
   <name>SomeOXProject</name>
   <class-mapping-descriptor xsi:type="xml-class-mapping-descriptor">
      <class>some.package.SomeClass</class>
      <alias>SomeAlias</alias>
...
 

この(DBWSBuilderユーティリティを使用しない)方法でDBWSのWebサービスを構築する場合は、すべての必要なデプロイメント・アーティファクトを作成してください。

2.4 SQL文からのDBWSサービスの作成

この項では、次の内容について説明します。

2.4.1 カスタムSQL SELECT文の結果セットからの作成

EclipseLink DBWSでは、カスタムSQL SELECT文の実行結果を表示する(実際のSQLは表示しないで)Webサービスを作成できます。戻されるデータの構造を決めるメタデータはなく、単純なXML形式のスキーマが使用されます。

このサービスの対象となるSQL SELECT文は、次に示すとおり、DBWSBuilderのXMLファイル内にあります。

例2-8 DBWSBuilder XMLファイルの例

<?xml version="1.0" encoding="UTF-8"?>
<dbws-builder xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <properties>
    <property name="projectName">testSql</property>
    ... database properties
  </properties>
  <sql
    name="count"
    simpleXMLFormatTag="aggregate-info"
    xmlTag="count"
    >
    <text><![CDATA[select count(*) from EMP]]></text>
  </sql>
  <sql
    name="countAndMaxSalary"
    simpleXMLFormatTag="aggregate-info"
    xmlTag="count-and-max-salary"
    >
    <text><![CDATA[select count(*) as "COUNT", max(SAL) as "MAX-Salary" from EMP]]></text>
  </sql>
</dbws-builder>
 

Webサービスを作成するには、次のコマンドを使用します。

prompt > dbwsbuilder.cmd -builderFile dbws-builder.xml -stageDir output_directory -packageAs wls testSql.war
 

説明:

  • dbws-builder.xml : DBWS builder XML構成ファイル(前述のとおり)

  • output_directory: 生成されるファイルの出力ディレクトリ

  • -packageAs: Webサービスがデプロイされるプラットフォーム

生成されるeclipselink-dbws-schema.xsdファイルは、単純なXML形式のスキーマです。

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  >
  <xsd:complexType name="simple-xml-format">
    <xsd:sequence>
      <xsd:any minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>
 

要素タグsimple-xml-formatsimple-xmlは、SQL操作でカスタマイズされます。例: <simple-xml-format> = <aggregate-info>, <simple-xml> = <count-and-max-salary>

2.4.1.1 生成されたEclipseLink DBWSサービス・ディスクリプタ

デフォルトの<element-tag>名Simple XML Formatを変更する設定とともに、SQL操作はEclipseLinkで作成されるDBWSサービス・ディスクリプタ・ファイル(eclipselink-dbws.xml)に含まれます。

例2-9 サンプルXMLファイル

<?xml version="1.0" encoding="UTF-8"?>
<dbws xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="urn:testSql" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <name>testSql</name>
   <sessions-file>eclipselink-dbws-sessions.xml</sessions-file>
   <query>
      <name>count</name>
      <result>
         <type>simple-xml-format</type>
         <simple-xml-format>
            <simple-xml-format-tag>aggregate-info</simple-xml-format-tag>
            <simple-xml-tag>count</simple-xml-tag>
         </simple-xml-format>
      </result>
      <sql>
         <![CDATA[select count(*) from EMP]]>
      </sql>
   </query>
   <query>
      <name>countAndMaxSalary</name>
      <result>
         <type>simple-xml-format</type>
         <simple-xml-format>
            <simple-xml-format-tag>aggregate-info</simple-xml-format-tag>
            <simple-xml-tag>count-and-max-salary</simple-xml-tag>
         </simple-xml-format>
      </result>
      <sql>
         <![CDATA[select count(*) as "COUNT", max(SAL) as "MAX-Salary" from EMP]]>
      </sql>
   </query>
</dbws>
 
2.4.1.1.1 SOAPメッセージ

次のSOAPメッセージによって、DBWSサービスtestSqlに対して<count>操作を起動します。

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Body>
    <count xmlns="urn:testSqlService" xmlns:urn="urn:testSql"/>
  </env:Body>
</env:Envelope>
 

次のように戻されます。

<?xml version="1.0" encoding="utf-16"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header />
  <SOAP-ENV:Body>
    <srvc:countResponse xmlns:srvc="urn:testSqlService">
      <srvc:result>
        <aggregate-info xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="simple-xml-format">
          <count>
            <COUNT_x0028__x002A__x0029_>14</COUNT_x0028__x002A__x0029_>
          </count>
        </aggregate-info>
      </srvc:result>
    </srvc:countResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
 

注意:

SQL/X仕様(SQL/XML:2003)に記載のとおり、select count(*);resultSetで、(、*および)の文字は、XML要素タグには使用できず、既知の変換結果に置き換えられることに注意してください。


2.4.1.1.2 表ベースのWebサービスのサブ操作としてのカスタムSQL

SOAPメッセージ操作では、構造化されていないデータが戻されます。ただし、そのような表ベースの操作のコンテキスト内の操作をネストすることが可能で、そのネストした処理を親表のスキーマ要素型を再使用するように構成し、構造化データを戻すことができます。

<dbws-builder>
  <properties>
    <property name="projectName">empSql</property>
    ... database properties
  </properties>
  <table
    catalogPattern="%"
    tableNamePattern="EMP"
    >
    <sql
      name="findEmpByName"
      isCollection="true"
      returnType="empType"
      >
      <text><![CDATA[select * from EMP where ENAME like ?]]></text>
      <binding name="ENAME" type="xsd:string"/>
    </sql>
  </table>
 </dbws-builder>
 

生成されたEclipseLink DBWSサービス・ディスクリプタeclipselink-dbws.xmlファイル:

例2-10 eclipselink-dbws.xmlファイルの例

<dbws xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="urn:testSql" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <name>empSql</name>
   <sessions-file>eclipselink-dbws-sessions.xml</sessions-file>
   <update>
      <name>update_empType</name>
      <parameter>
         <name>theInstance</name>
         <type>ns1:empType</type>
      </parameter>
   </update>
   ...
   <query>
      <name>findEmpByName</name>
      <parameter>
         <name>ENAME</name>
         <type>xsd:string</type>
      </parameter>
      <result isCollection="true">
         <type>ns1:empType</type>
      </result>
      <sql>
         <![CDATA[select * from EMP where ENAME like #ENAME]]>
      </sql>
   </query>
</dbws>

2.4.2 カスタムSQL SELECT文のスキーマ形式の結果を使用した作成

EclipseLinkでは、戻される結果の形式を実行時ではなく設計時に指定するWebサービスを作成することもできます。通常、カスタムSQL SELECT文はjava.sql.ResultSetsを戻し、戻される情報の名前とデータ型はjava.sql.ResultSetMetaData API(getColumnCountgetColumnLabelgetColumnTypeなど)を使用して指定することができます。

EclipseLink DBWSは、Simplified XML Format (SXF)を使用してXMLドキュメントを作成し、ResultSetの情報を記述します。ただしこのドキュメントは任意に変更することができるため、SXFスキーマは非常に自由度が高く、ドキュメントでのxsd:anyの使用には事実上制限がありません。

例2-11 サンプル・スキーマ

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  >
  <xsd:complexType name="simple-xml-format">
    <xsd:sequence>
      <xsd:any minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>
 

例2-12 インスタンス・ドキュメント:

<source lang="xml">
<?xml version = '1.0' encoding = 'UTF-8'?>
<simple-xml-format>
  <simple-xml>
    <EMPNO>7788</EMPNO>
    <ENAME>SCOTT</ENAME>
    <JOB>ANALYST</JOB>
    <MGR>7566</MGR>
    <HIREDATE>1987-04-19</HIREDATE>
    <SAL>3000</SAL>
    <DEPTNO>20</DEPTNO>
  </simple-xml>
  <simple-xml>
    <EMPNO>7369</EMPNO>
    <ENAME>SMITH</ENAME>
    <JOB>CLERK</JOB>
    <MGR>7902</MGR>
    <HIREDATE>1980-12-17</HIREDATE>
    <SAL>800</SAL>
    <DEPTNO>20</DEPTNO>
  </simple-xml>
</simple-xml-format>
 

2.4.2.1 その他の設計時の情報

前述のとおり、設計時にjava.sql.ResultSetMetaData APIを利用できる場合、スキーマの作成に十分な情報を得ることができます。次に例を示します。

例2-13 サンプル・スキーマ

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:emp" xmlns="urn:emp" elementFormDefault="qualified">
   <xsd:complexType name="empType">
      <xsd:sequence>
         <xsd:element name="empno" type="xsd:decimal"/>
         <xsd:element name="ename" type="xsd:string" minOccurs="0" nillable="true"/>
         <xsd:element name="job" type="xsd:string" minOccurs="0" nillable="true"/>
         <xsd:element name="mgr" type="xsd:decimal" minOccurs="0" nillable="true"/>
         <xsd:element name="hiredate" type="xsd:date" minOccurs="0" nillable="true"/>
         <xsd:element name="sal" type="xsd:decimal" minOccurs="0" nillable="true"/>
         <xsd:element name="comm" type="xsd:decimal" minOccurs="0" nillable="true"/>
         <xsd:element name="deptno" type="xsd:decimal" minOccurs="0" nillable="true"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:element name="empType" type="empType"/>
</xsd:schema>
 

設計時にSQL文を追加で実行することでDBWSのsql操作が高度なものになります。文では行を戻しません(例2-14WHERE句の評価がfalseの場合など):

例2-14 SQL文の追加実行

<?xml version="1.0" encoding="UTF-8"?>
<dbws-builder xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    <properties>
        <property name="projectName">emp</property>
        ...
    </properties>
    <sql
        name="Semployees"
        isCollection="false"
        returnType="empType"
        >
        <statement><![CDATA[select * from EMP where ENAME like 'S%']]></statement>
        <build-statement><![CDATA[select * from EMP where 0=1]]></build-statement>
    </sql>
</dbws-builder>
 

2.4.2.2 問題と制限の理解

次の制限に注意してください。

2.4.2.2.1 ラベルの繰返し

有効なSQLで、複数の同一の列を指定できます。たとえば、次のSQLを考えてみます。

SELECT ENAME, ENAME FROM EMP WHERE LIKE 'S%'
ENAME ENAME

SMITH

SMITH

...

...

SCOTT

SCOTT


この例で、UNIONを使用するSELECT文は一連の列ラベルを戻し、ラベルには繰返しがあります。

DBWSBuilderは、すでに処理された列を保持し、重複を検出したときに例外をスローします。

2.4.2.2.2 互換性のある列ラベルの設定

実行時SQL文と設計時のSQL文で、互換性のある列ラベルの設定を戻す必要があります。EclipseLinkは、列の設定を同一にするための事前処理を実行しないため、サービスが起動されると実行時にエラーが検出されます。

2.5 ストアド・プロシージャからの作成

EclipseLink DBWSでは、ストアド・プロシージャ(または複数のプロシージャ)を表示するWebサービスを作成できます。ストアド・プロシージャのメタデータから戻されるデータの構造は判断できないため、EclipseLinkでは単純なXML形式のスキーマを使用します。EclipseLink DBWSでは、実行時に単純で読みやすいXMLドキュメントを作成します。

EclipseLink DBWSはINOUTおよびIN OUTといった引数の任意の組合せをサポートします。またEclipseLinkではオーバーロードされる(異なるパラメータの同じ名前)パッケージ内のプロシージャもサポートします。

2.5.1

この例では次のストアド・プロシージャを使用します。

DROP PROCEDURE TESTECHO;
CREATE OR REPLACE PROCEDURE TESTECHO(T IN VARCHAR2, U OUT VARCHAR2) AS
BEGIN
    U := CONCAT(T, '-test');
END;
 

DBWSBuilderユーティリティでは、入力として次に示すようなDBWS構成XMLファイルが必要です。

<?xml version="1.0" encoding="UTF-8"?>
<dbws-builder xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <properties>
    <property name="projectName">testEcho</property>
    ... database properties
  </properties>
  <procedure
    name="testEcho"
    procedurePattern="TESTECHO"
    isSimpleXMLFormat="true"
  />
</dbws-builder>
 

次のようにしてDBWSBuilderを実行します。

prompt > dbwsbuilder.cmd -builderFile dbws-builder.xml -stageDir output_directory -packageAs wls testEcho.war
 

説明:

  • dbws-builder.xml : DBWS builder XML構成ファイル(前述のとおり)

  • output_directory: 生成されるファイルの出力ディレクトリ

  • packageAs: Webサービスがデプロイされるプラットフォーム

生成されるeclipselink-dbws-schema.xsdファイルは、次に示すように、単純なXML形式のスキーマです。

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  >
  <xsd:complexType name="simple-xml-format">
    <xsd:sequence>
      <xsd:any minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>
 

SQL操作で適切なプロパティを設定することで、simple-xml-formatタグとsimple-xmlタグをカスタマイズすることができます。

2.6 ストアド・ファンクションからの作成

EclipseLink DBWSでは、単純なストアド・ファンクションを表示するWebサービスを作成できます。

2.6.1

この例では、次のストアド・ファンクションが使用されます。

DROP FUNCTION TESTECHO;
CREATE OR REPLACE FUNCTION TESTECHO(T IN VARCHAR2) RETURN VARCHAR2 IS retVal VARCHAR2
BEGIN
              retVal := CONCAT('test-' , T);
              RETURN retVal;
END TESTECHO;
 

DBWSBuilderユーティリティでは、入力として次に示すようなDBWS構成XMLファイルが必要です。

<?xml version="1.0" encoding="UTF-8"?>
<dbws-builder xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <properties>
    <property name="projectName">testEcho</property>
    ... database properties
  </properties>
  <procedure
    name="testEcho"
    procedurePattern="TESTECHO"
    returnType="xsd:string"
  />
</dbws-builder>
 

次のようにしてDBWSBuilderを実行します。

prompt > dbwsbuilder.cmd -builderFile dbws-builder.xml -stageDir output_directory -packageAs wls testEcho.war
 

説明:

  • dbws-builder.xml : DBWS builder XML構成ファイル(前述のとおり)

  • output_directory: 生成されるファイルの出力ディレクトリ

  • -packageAs: Webサービスがデプロイされるプラットフォーム

2.7 複合PL/SQL引数を使用したストアド・プロシージャからの作成

TopLinkを使用すると、IN引数、OUT引数、またはIN OUT引数のいずれかに複合PL/SQL型を使用するストアド・プロシージャからDBWSのWebサービスを作成できます。

2.7.1

この例では、次のストアド・ファンクションが使用されます。

PROCEDURE P1(OLDREC IN ARECORD, FOO IN VARCHAR2, AREC OUT ARECORD) IS  BEGIN    AREC.T1 := ... some processing based upon OLDREC    AREC.T2 := ... AND FOO    AREC.T3 := ...  END P1;
 

ARECORDはPL/SQLパッケージSOMEPACKAGE内で、次のように定義されています。

CREATE OR REPLACE PACKAGE SOMEPACKAGE AS
  TYPE TBL1 IS TABLE OF VARCHAR2(111) INDEX BY BINARY_INTEGER;
  TYPE TBL2 IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  TYPE ARECORD IS RECORD (
    T1 TBL1,
    T2 TBL2,
    T3 BOOLEAN
  );
  PROCEDURE P1(OLDREC IN ARECORD, FOO IN VARCHAR2, AREC OUT ARECORD);
END SOMEPACKAGE;

PL/SQLのレコードとコレクション型はJDBC経由で送ることができないため、TopLinkはJDBCおよびPL/SQl型と変換するファンクションが含まれる、PL/SQLコードの無名ブロックを生成します。正常に完了させるには、ININ OUTまたはOUT OF RETURN引数(これらの引数内でネストされているPL/SQLレコードまたはコレクション・タイプ)で使用されるそれぞれのPL/SQL型またはコレクション型のJDBC型は同じである必要があります。この型の名前は、<package name>_<type name>の形式にします。

この例では、次のJDBC型が必要です。

CREATE OR REPLACE TYPE SOMEPACKAGE_TBL1 AS TABLE OF VARCHAR2(111)
 
CREATE OR REPLACE TYPE SOMEPACKAGE_TBL2 AS TABLE OF NUMBER
 
CREATE OR REPLACE TYPE SOMEPACKAGE_ARECORD AS OBJECT (
  T1 SOMEPACKAGE_TBL1,
  T2 SOMEPACKAGE_TBL2,
  T3 BOOLEAN
)

DBWSBuilderユーティリティでは、入力としてDBWS構成ファイルが必要です。

<?xml version="1.0" encoding="UTF-8"?>
<dbws-builder xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <properties>
    <property name="projectName">testPLSQLProcedure</property>
    ... database properties
  </properties>
  <plsql-procedure
    name="plsqlprocedure"
    catalogPattern="SOMEPACKAGE"
    procedurePattern="P1"
  />
</dbws-builder>

returnTypeSOMEPACKAGE_ARECORDに設定されます。この値は、生成されたEclipseLink DBWSスキーマの複合型を示します(次に示します)。ここではSOMEPACKAGEパッケージのコンテンツに基づいて作成されます。

次のようにしてDBWSBuilderを実行します。

prompt > dbwsbuilder.cmd -builderFile dbws-builder.xml -stageDir output_directory -packageAs wls testPLSQLProcedure.war

説明:

  • dbws-builder.xml: DBWS Builderの構成ファイル(前述のとおり)

  • output_directory: 生成されるファイルの出力ディレクトリ

  • -packageAs: Webサービスがデプロイされるプラットフォーム

生成されるeclipselink-dbws-schema.xsdファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:plsqlprocedure" xmlns="urn:plsqlprocedure" elementFormDefault="qualified">
   <xsd:complexType name="SOMEPACKAGE_TBL1">
      <xsd:sequence>
         <xsd:element name="item" type="xsd:string" maxOccurs="unbounded" nillable="true"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="SOMEPACKAGE_TBL2">
      <xsd:sequence>
         <xsd:element name="item" type="xsd:decimal" maxOccurs="unbounded" nillable="true"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="SOMEPACKAGE_ARECORD">
      <xsd:sequence>
         <xsd:element name="t1">
            <xsd:complexType>
               <xsd:sequence>
                  <xsd:element name="item" type="xsd:string" maxOccurs="unbounded" nillable="true"/>
               </xsd:sequence>
            </xsd:complexType>
         </xsd:element>
         <xsd:element name="t2">
            <xsd:complexType>
               <xsd:sequence>
                  <xsd:element name="item" type="xsd:decimal" maxOccurs="unbounded" nillable="true"/>
               </xsd:sequence>
            </xsd:complexType>
         </xsd:element>
         <xsd:element name="t3" type="xsd:boolean" nillable="true"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="simple-xml-format">
      <xsd:sequence>
         <xsd:any minOccurs="0"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:element name="SOMEPACKAGE_TBL1" type="SOMEPACKAGE_TBL1"/>
   <xsd:element name="SOMEPACKAGE_TBL2" type="SOMEPACKAGE_TBL2"/>
   <xsd:element name="SOMEPACKAGE_ARECORD" type="SOMEPACKAGE_ARECORD"/>
</xsd:schema>

2.8 複合PL/SQL引数を使用したストアド・ファクションからの作成

EclipseLink 2.3から、IN引数または戻される引数に複合PL/SQL型を使用するストアド・ファンクションからDBWS Webサービスを作成できるようになりました。

2.8.1

この例では、次のストアド・ファンクションが使用されます。

FUNCTION F1(OLDREC IN ARECORD, FOO IN VARCHAR2) RETURN ARECORD IS
  arec ARECORD; -- temp var
  BEGIN
    arec.T1 := ... some processing based upon OLDREC
    arec.T2 := ... AND FOO
    arec.T3 := ...
    RETURN arec;
  END F1;
 

ARECORDはPL/SQLパッケージSOMEPACKAGE内で、次のように定義されています。

CREATE OR REPLACE PACKAGE SOMEPACKAGE AS
  TYPE TBL1 IS TABLE OF VARCHAR2(111) INDEX BY BINARY_INTEGER;
  TYPE TBL2 IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  TYPE ARECORD IS RECORD (
    T1 TBL1,
    T2 TBL2,
    T3 BOOLEAN
  );
  FUNCTION F1(OLDREC IN ARECORD, FOO IN VARCHAR2) RETURN ARECORD;
END SOMEPACKAGE;
 

PL/SQL型とコレクション型はJDBC経由で送ることができないため、TopLinkはJDBCおよびPL/SQl型と変換するファンクションが含まれる、PL/SQLコードの無名ブロックを生成します。正常に完了させるには、ININ OUTまたはOUT OF RETURN引数(これらの引数内でネストされているPL/SQLレコードまたはコレクション・タイプ)で使用されるそれぞれのPL/SQL型またはコレクション型のJDBC型は同じである必要があります。この型の名前は、<package name>_<type name>の形式にします。

この例では、次のJDBC型が必要です。

CREATE OR REPLACE TYPE SOMEPACKAGE_TBL1 AS TABLE OF VARCHAR2(111)
 
CREATE OR REPLACE TYPE SOMEPACKAGE_TBL2 AS TABLE OF NUMBER
 
CREATE OR REPLACE TYPE SOMEPACKAGE_ARECORD AS OBJECT (
  T1 SOMEPACKAGE_TBL1,
  T2 SOMEPACKAGE_TBL2,
  T3 BOOLEAN
)

DBWSBuilderユーティリティでは、入力としてDBWS構成ファイルが必要です。

<?xml version="1.0" encoding="UTF-8"?>
<dbws-builder xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <properties>
    <property name="projectName">testPLSQLFunction</property>
    ... database properties
  </properties>
  <plsql-procedure
    name="plsqlfunction"
    catalogPattern="SOMEPACKAGE"
    procedurePattern="F1"
    returnType="SOMEPACKAGE_ARECORD"
  />
</dbws-builder>
 

returnTypeSOMEPACKAGE_ARECORDに設定されます。この値は、生成されたEclipseLink DBWSスキーマの複合型を示します(次に示します)。ここではSOMEPACKAGEパッケージのコンテンツに基づいて作成されます。

次のようにしてDBWSBuilderを実行します。

prompt > dbwsbuilder.cmd -builderFile dbws-builder.xml -stageDir output_directory -packageAs wls testPLSQLFunction.war
 

説明:

  • dbws-builder.xml: DBWS Builderの構成ファイル(前述のとおり)

  • output_directory: 生成されるファイルの出力ディレクトリ

  • -packageAs: Webサービスがデプロイされるプラットフォーム

生成されるeclipselink-dbws-schema.xsdファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:plsqlfunction" xmlns="urn:plsqlfunction" elementFormDefault="qualified">
   <xsd:complexType name="SOMEPACKAGE_TBL1">
      <xsd:sequence>
         <xsd:element name="item" type="xsd:string" maxOccurs="unbounded" nillable="true"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="SOMEPACKAGE_TBL2">
      <xsd:sequence>
         <xsd:element name="item" type="xsd:decimal" maxOccurs="unbounded" nillable="true"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="SOMEPACKAGE_ARECORD">
      <xsd:sequence>
         <xsd:element name="t1">
            <xsd:complexType>
               <xsd:sequence>
                  <xsd:element name="item" type="xsd:string" maxOccurs="unbounded" nillable="true"/>
               </xsd:sequence>
            </xsd:complexType>
         </xsd:element>
         <xsd:element name="t2">
            <xsd:complexType>
               <xsd:sequence>
                  <xsd:element name="item" type="xsd:decimal" maxOccurs="unbounded" nillable="true"/>
               </xsd:sequence>
            </xsd:complexType>
         </xsd:element>
         <xsd:element name="t3" type="xsd:boolean" nillable="true"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="simple-xml-format">
      <xsd:sequence>
         <xsd:any minOccurs="0"/>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:element name="SOMEPACKAGE_TBL1" type="SOMEPACKAGE_TBL1"/>
   <xsd:element name="SOMEPACKAGE_TBL2" type="SOMEPACKAGE_TBL2"/>
   <xsd:element name="SOMEPACKAGE_ARECORD" type="SOMEPACKAGE_ARECORD"/>
</xsd:schema>

2.9 オーバーロードされたPL/SQLストアド・プロシージャからの作成

リリース2.3から、EclipseLInk DBWSでは、複数のPL/SQLストアド・プロシージャを表示するWebサービスを作成できるようになりました。DBWS Builderファイル内のすべてのストアド・プロシージャを指定するのではなく、プロシージャ名を1つだけ指定し、異なるパラメータでオーバーロードできます。


注意:

この機能ではOracleのようにオーバーロードをサポートしているデータベースが必要です。


2.9.1

この例では、ストアド・プロシージャに異なるパラメータが含まれています。

CREATE PROCEDURE P(SIMPLARRAY IN TBL1, FOO IN VARCHAR2) AS
BEGIN
  -- 2 arguments SIMPLARRAY and FOO
END P;
CREATE PROCEDURE P(SIMPLARRAY IN TBL1, FOO IN VARCHAR2, BAR IN VARCHAR2) AS
BEGIN
  -- (same name 'P') 3 arguments SIMPLARRAY, FOO and BAR
END P;
 

EclipseLink DBWSはINOUTおよびIN OUTといった引数の任意の組合せをサポートします。

TBL1はPL/SQLパッケージSOMEPACKAGE内で、次のように定義されています。

CREATE OR REPLACE PACKAGE SOMEPACKAGE AS
  TYPE TBL1 IS TABLE OF VARCHAR2(111) INDEX BY BINARY_INTEGER;
  PROCEDURE P(SIMPLARRAY IN TBL1, FOO IN VARCHAR2);
  PROCEDURE P(SIMPLARRAY IN TBL1, FOO IN VARCHAR2, BAR IN VARCHAR2);
END SOMEPACKAGE;
 

DBWSBuilderユーティリティでは、入力として次に示すようなDBWS構成ファイルが必要です。

<?xml version="1.0" encoding="UTF-8"?>
<dbws-builder xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <properties>
    <property name="projectName">testOverloadedProcedure</property>
    ... database properties
  </properties>
  <plsql-procedure
    name="overloadedProcedure"
    catalogPattern="SOMEPACKAGE"
    procedurePattern="P"
  />
</dbws-builder>
 

DBWSBuilderを実行するには、次のコマンドを使用します。

prompt > dbwsbuilder.cmd -builderFile dbws-builder.xml -stageDir output_directory -packageAs wls testEcho.war
 

説明:

  • dbws-builder.xml: DBWS構成ファイル(前述のとおり)

  • output_directory: 生成されるファイルの出力ディレクトリ

  • -packageAs : Webサービスがデプロイされるプラットフォーム

オーバーロードされるプロシージャが使用される問合せおよびWSDLの生成時、一意の索引で各プロシージャを識別します。索引は1から開始し、オーバーロードされるプロシージャごとに1ずつ増分します。

この例で、EclipseLinkは次のeclipselink-dbws.wsdl(Web Services Description Language)を生成します。

<wsdl:definitions
     name="plsqloverloadService"
     targetNamespace="urn:plsqloverloadService"
     xmlns:ns1="urn:plsqloverload"
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
     xmlns:tns="urn:plsqloverloadService"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    >
    <wsdl:types>
        <xsd:schema elementFormDefault="qualified" targetNamespace="urn:plsqloverloadService" xmlns:tns="urn:plsqloverloadService"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <xsd:import namespace="urn:plsqloverload" schemaLocation="eclipselink-dbws-schema.xsd"/>
            <xsd:complexType name="p1ResponseType">
                <xsd:sequence>
                    <xsd:element name="result">
                        <xsd:complexType><xsd:sequence><xsd:any/></xsd:sequence></xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:complexType>
            <xsd:complexType name="p1RequestType">
                <xsd:sequence>
                    <xsd:element name="SIMPLARRAY" type="ns1:SOMEPACKAGE_TBL1"/>
                    <xsd:element name="FOO" type="xsd:string"/>
                </xsd:sequence>
            </xsd:complexType>
            <xsd:complexType name="p2ResponseType">
                <xsd:sequence>
                    <xsd:element name="result">
                        <xsd:complexType><xsd:sequence><xsd:any/></xsd:sequence></xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:complexType>
            <xsd:complexType name="p2RequestType">
                <xsd:sequence>
                    <xsd:element name="SIMPLARRAY" type="ns1:SOMEPACKAGE_TBL1"/>
                    <xsd:element name="FOO" type="xsd:string"/>
                    <xsd:element name="BAR" type="xsd:string"/>
                </xsd:sequence>
            </xsd:complexType>
            <xsd:element name="p2" type="tns:p2RequestType"/>
            <xsd:element name="p1" type="tns:p1RequestType"/>
            <xsd:element name="p1Response" type="tns:p1ResponseType"/>
            <xsd:element name="p2Response" type="tns:p2ResponseType"/>
        </xsd:schema>
    </wsdl:types>
    <wsdl:message name="p2Request"><wsdl:part name="p2Request" element="tns:p2"/></wsdl:message>
    <wsdl:message name="p2Response"><wsdl:part name="p2Response" element="tns:p2Response"/></wsdl:message>
    <wsdl:message name="p1Request"><wsdl:part name="p1Request" element="tns:p1"/></wsdl:message>
    <wsdl:message name="p1Response"><wsdl:part name="p1Response" element="tns:p1Response"/></wsdl:message>
    <wsdl:portType name="plsqloverloadService_Interface">
        <wsdl:operation name="p2">
            <wsdl:input message="tns:p2Request"/>
            <wsdl:output message="tns:p2Response"/>
        </wsdl:operation>
        <wsdl:operation name="p1">
            <wsdl:input message="tns:p1Request"/>
            <wsdl:output message="tns:p1Response"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="plsqloverloadService_SOAP_HTTP" type="tns:plsqloverloadService_Interface">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="p2">
            <soap:operation soapAction="urn:plsqloverloadService:p2"/>
            <wsdl:input><soap:body use="literal"/></wsdl:input>
            <wsdl:output><soap:body use="literal"/></wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="p1">
            <soap:operation soapAction="urn:plsqloverloadService:p1"/>
            <wsdl:input><soap:body use="literal"/></wsdl:input>
            <wsdl:output><soap:body use="literal"/></wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="plsqloverloadService">
        <wsdl:port name="plsqloverloadServicePort" binding="tns:plsqloverloadService_SOAP_HTTP">
            <soap:address location="REPLACE_WITH_ENDPOINT_ADDRESS"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>


脚注の凡例

脚注 1: 同じアルゴリズムが次の一部として記載されています: SQL/X (またはSQL/XML:2003)仕様。