この章では、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> ...
注意: この( |
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)に記載のとおり、 |
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)仕様。