| Oracle® Fusion Middleware Oracle TopLinkデータベースWebサービスによる永続性アーキテクチャの開発 12c (12.2.1.2.0) E82675-01 |
|
![]() 前 |
![]() 次 |
この章では、EclipseLink DBWSサービスを作成する方法を説明します。
この章の内容は次のとおりです。
データベース表のCRUD (Create/Read[findByPKおよびfindAll]/Update/Delete)操作を公開するWebサービスを作成できます。EclipseLinkは、これをデータベース上の表または複数の表(カタログ、スキーマまたは表名に%をサポートするパターンを使用)に対してサポートし、そのデータベースではJDBCドライバが表のメタデータをJDBCメタデータAPI(java.sql.DatabaseMetaData)を経由して確実に正確に送ります。
EclipseLinkはDBWSBuilderユーティリティを使用して、次のルールでDBWS XMLスキーマを生成します。
表名==>XMLでサポートされない文字に変換脚注 1 ==> 小文字に変換 ==> 接尾辞'Type'を追加 ==> .xsdファイルのtop-level複合型
列名 ==> XMLでサポートされない文字に変換脚注 1 ==> 小文字に変換 ==> <element-tag>名になる
すべての列は要素で表現されます
BLOB列は自動的にxsd:base64Binaryにマップされます
xsd:base64Binary要素をXMLドキュメントにインラインで含めるか、またはバイナリの添付ファイルとして(SwaRefスタイルまたはMTOMスタイル)処理できます
例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>
生成される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>
次の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>
DBWSでEclipseLink SessionCustomizerを使用すると、EclipseLink APIにアクセスして、セッションからORマッピング・ディスクリプタ(object-relational)またはOXマッピング・ディスクリプタ(object-XML)を取得できます。次にディスクリプタを使用してマッピングを追加、変更または削除します。
詳細は、『Oracle TopLinkの理解』の「セッション」を参照してください。
この例は、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プロジェクト(それぞれに)に適用されるかどうかを指定する必要があります。
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サービスを構築する場合は、すべての必要なデプロイメント・アーティファクトを作成してください。 |
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サービスを構築する場合は、すべての必要なデプロイメント・アーティファクトを作成してください。
この項では、次の内容について説明します。
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-formatとsimple-xmlは、SQL操作でカスタマイズされます。例: <simple-xml-format> = <aggregate-info>, <simple-xml> = <count-and-max-salary>
デフォルトの<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>
次の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要素タグには使用できず、既知の変換結果に置き換えられることに注意してください。 |
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>
EclipseLinkでは、戻される結果の形式を実行時ではなく設計時に指定するWebサービスを作成することもできます。通常、カスタムSQL SELECT文はjava.sql.ResultSetsを戻し、戻される情報の名前とデータ型はjava.sql.ResultSetMetaData API(getColumnCount、getColumnLabel、getColumnTypeなど)を使用して指定することができます。
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>
前述のとおり、設計時に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-14のWHERE句の評価が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>
次の制限に注意してください。
有効なSQLで、複数の同一の列を指定できます。たとえば、次のSQLを考えてみます。
SELECT ENAME, ENAME FROM EMP WHERE LIKE 'S%'
| ENAME | ENAME |
|---|---|
| SMITH | SMITH |
| ... | ... |
| SCOTT | SCOTT |
この例で、UNIONを使用するSELECT文は一連の列ラベルを戻し、ラベルには繰返しがあります。
DBWSBuilderは、すでに処理された列を保持し、重複を検出したときに例外をスローします。
実行時SQL文と設計時のSQL文で、互換性のある列ラベルの設定を戻す必要があります。EclipseLinkは、列の設定を同一にするための事前処理を実行しないため、サービスが起動されると実行時にエラーが検出されます。
EclipseLink DBWSでは、ストアド・プロシージャ(または複数のプロシージャ)を表示するWebサービスを作成できます。ストアド・プロシージャのメタデータから戻されるデータの構造は判断できないため、EclipseLinkでは単純なXML形式のスキーマを使用します。EclipseLink DBWSでは、実行時に単純で読みやすいXMLドキュメントを作成します。
EclipseLink DBWSはIN、OUTおよびIN OUTといった引数の任意の組合せをサポートします。またEclipseLinkではオーバーロードされる(異なるパラメータの同じ名前)パッケージ内のプロシージャもサポートします。
この例では次のストアド・プロシージャを使用します。
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タグをカスタマイズすることができます。
EclipseLink DBWSでは、単純なストアド・ファンクションを表示するWebサービスを作成できます。
この例では、次のストアド・ファンクションが使用されます。
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サービスがデプロイされるプラットフォーム
TopLinkを使用すると、IN引数、OUT引数、またはIN OUT引数のいずれかに複合PL/SQL型を使用するストアド・プロシージャからDBWSのWebサービスを作成できます。
この例では、次のストアド・ファンクションが使用されます。
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コードの無名ブロックを生成します。正常に完了させるには、IN、IN 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>
returnTypeはSOMEPACKAGE_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>
EclipseLink 2.3から、IN引数または戻される引数に複合PL/SQL型を使用するストアド・ファンクションからDBWS Webサービスを作成できるようになりました。
この例では、次のストアド・ファンクションが使用されます。
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コードの無名ブロックを生成します。正常に完了させるには、IN、IN 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>
returnTypeはSOMEPACKAGE_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.3から、EclipseLInk DBWSでは、複数のPL/SQLストアド・プロシージャを表示するWebサービスを作成できるようになりました。DBWS Builderファイル内のすべてのストアド・プロシージャを指定するのではなく、プロシージャ名を1つだけ指定し、異なるパラメータでオーバーロードできます。
|
注意: この機能ではOracleのようにオーバーロードをサポートしているデータベースが必要です。 |
この例では、ストアド・プロシージャに異なるパラメータが含まれています。
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はIN、OUTおよび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)仕様。