ヘッダーをスキップ

Oracle Application Server Web Services開発者ガイド
10g(10.1.3.1.0)

B31868-01
目次
目次
索引
索引

戻る 次へ

10 データベースWebサービスのアセンブル

この章では、Oracleデータベースと対話できるOracle Application Server Web Servicesを開発する方法について説明します。OracleAS Web Servicesがデータベースと対話するには、コールインおよびコールアウトの2つの方法があります。Webサービスのコールインとは、データベース・リソースにアクセスするWebサービスを提供することです。WebサービスはOC4Jインスタンス上で動作し、JDBCを介してデータベース・リソースにアクセスします。

Webサービスのコールアウトとは、データベース内から外部Webサービスを起動することです。起動は、データベース内で実行されるSQL、PL/SQLまたはJavaコードから行われます。

この章の項目は、次のとおりです。

データベースWebサービスの概要

Webサービスのテクノロジを使用すると、Webを介することで、プラットフォーム、言語またはデータ・フォーマットにかかわらず、アプリケーション間の対話が可能になります。XML、SOAP、WSDL、UDDI、WS-SecurityおよびWS-Reliabilityなどの主要要素は、ソフトウェア業界全体で採用されています。Webサービス・テクノロジは、通常中間層のアプリケーション・サーバーに実装およびデプロイされるサービスを指しています。ただし、異機種間で接続されていない環境では、ストアド・プロシージャ、データおよびメタデータへのWebサービス・インタフェース経由でのアクセス要求が増大しています。データベースWebサービス・テクノロジは、Webサービスに対するデータベースからのアプローチです。アプローチには2方向あります。

データベースのコールイン

OracleデータベースをWebサービス・プロバイダとして使用することで、Javaストアド・プロシージャ、PL/SQLパッケージ、アドバンスト・キュー、事前定義済SQL問合せおよびDMLへの投資を有効活用できます。クライアント・アプリケーションは、標準Webサービス・プロトコルを使用して、Oracleデータベースへのデータの問合せおよび取得、ならびにストアド・プロシージャの起動ができます。Oracle固有のデータベース接続プロトコルへの依存性はありません。アプリケーションはキャッシュされている任意のOC4J接続を使用できます。このアプローチは異機種間で接続されていない分散環境では特に有効です。

データベースWebサービスはOracleAS Web Servicesの一部であるため、整合性のある均一な開発/デプロイ環境に統合できます。Webサービスで公開されたデータベースとWebサービス・クライアントの間で交換されるメッセージを使用することで、OracleAS Web Servicesが提供するセキュリティ、信頼性、監査およびロギングなどの管理機能をすべて活用できます。

図10-1はWebサービスのコールインの説明図です。次の各ステップは、そのプロセスの説明です。

  1. データベース・サービスのタイプを問うリクエストがアプリケーション・サーバーに受信されます。サービス・エンドポイントが、リクエストされたサービスのタイプを暗黙的に指定します。

  2. OC4J JAX-RPC処理サーブレットはSOAPライブラリおよびXMLパーサーを参照し、リクエストをデコードします。

  3. サーブレットは、公開対象データベース操作に対応するようにWebServicesAssemblerによって生成されたクラスに、リクエストを渡します。WebServicesAssemblerはこれらのクラスを、Oracle JPublisherを暗黙的にコールして生成します。生成されたクラスは、データベースのPL/SQLパッケージ、問合せ、DML、AQストリームまたはJavaクラスを表すことができます。

  4. データベースはレスポンスをOC4J JAX-RPC処理サーブレットに渡します。このサーブレットはSOAPライブラリおよびXMLパーサーを参照してレスポンスをエンコードします。

  5. WSDLに従って生成されたSOAPレスポンスがクライアントに戻されます。

    関連項目

    PL/SQLパッケージ、SQL問合せ、DML文、Oracle AQストリームまたはサーバー・サイドJavaクラスのデータベース操作のWebサービスとしての公開の詳細は、「データベース・リソースを公開するWebサービスの開発」を参照してください。 

    図10-1    Webサービスによるデータベースへのコールイン


    画像の説明

データベースのコールアウト

Webサービスが組み込まれるように、リレーショナル・データベースの格納、索引付けおよび検索機能を拡張することができます。データベースからWebサービスをコールし、株価、為替レートまたは天気情報などのオンデマンドで生成される動的なデータの追跡、集約、リフレッシュおよび問合せが可能です。サービス・コンシューマとしてのデータベースの使用例として、複数のサプライヤからの在庫情報の取得およびローカルの在庫データベースの更新を行う、事前定義済データベース・ジョブからの外部Webサービスのコールがあげられます。もう1つの例として、Webクローラがあります。たとえば、複数の仕入先の製品/価格情報を照合するようにスケジュールされたデータベース・ジョブがそれです。

図10-2はデータベースのコールアウトの説明図です。

使用するメソッドは、起動元がSQLまたはPL/SQLか、それともJavaクラスであるかによって異なり、また、サービスが事前に認識されているか(静的起動)または実行時に初めて認識されるか(DII)によっても異なります。

関連項目

OracleAS Web Servicesが提供するデータベースからのPL/SQLおよびJavaコールアウトに対するサポートの詳細は、「データベースにおけるWebサービス・クライアントの開発」を参照してください。 

図10-2    データベース内からのWebサービスのコール


画像の説明

SQLとXMLの間の型マッピング

次の項では、Webサービスが事前に認識されている場合(静的起動)の、コールインおよびコールアウトで使用するSQLとXMLの間の型マッピングについて説明します。

Webサービスを実行時に認識させる場合は、Dynamic Invocation Interface(DII)またはUTL_DBWS PL/SQLパッケージのみを使用できます。JAX-RPC DIIの使用方法の詳細は、次のWebアドレスのAPIの記述を参照してください。

http://java.sun.com/j2ee/1.4/docs/#api

関連資料

UTL_DBWS パッケージの使用方法の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。 

Webサービスのコールインで使用されるSQLからXMLへの型マッピング

データベースWebサービスのコールインでは、PL/SQLストアド・プロシージャやSQL文などのSQL操作は、1つ以上のWebサービス操作にマッピングされます。SQL操作のパラメータはSQL型からXML型にマッピングされます。


注意

1つ以上の操作にマッピングされる可能性がある理由は、OracleAS Web ServicesがSQL値に対するXMLデータ表現の選択候補(SQL結果セットの異なる表現など)を追加で提供する場合があるためです。 


表10-1は、Webサービスのコールインで使用されるSQLからXMLへの型マッピングを示します。最初の列に記載されているのはSQL型です。表の2番目の列XML型(literal)は、use属性のデフォルトであるliteral値に関するSQLからXMLへの型マッピングを示します。3番目の列XML型(encoded)は、use属性のencoded値に関するマッピングを示します。literal値およびencoded値は、SOAPメッセージ・ボディのエンコーディング・ルールのことです。

関連項目

SOAPメッセージ・ボディのエンコーディング・ルールの詳細は、「use="literal"およびuse="encoded"」を参照してください。 

表10-1    Webサービスのコールインで使用されるSQLからXMLへの型マッピング 
SQL型  XML型(literal)  XML型(encoded) 

INT 

int 

int 

INTEGER 

int 

int 

FLOAT 

double 

double 

NUMBER 

decimal 

decimal 

VARCHAR2 

string 

string 

DATE 

dateTime 

dateTime 

TIMESTAMP 

dateTime 

dateTime 

BLOB 

byte[] 

byte[] 

CLOB 

String 

String 

LONG 

String 

String 

RAW 

byte[] 

byte[] 

プリミティブPL/SQL索引付き表 

Array 

Array 

PL/SQL Boolean 

boolean 

boolean 

PL/SQL索引付き表 

complexType 

complexType 

PL/SQLレコード 

complexType 

complexType 

REF CURSOR

nameBeans) 

Array 

Array 

REF CURSOR

nameXML) 

any 

text_xml 

REF CURSOR

nameXMLRowSet) 

swaRef 

text_xml 

SQLオブジェクト 

complexType 

complexType 

SQL表 

complexType 

complexType 

SYS.XMLTYPE 

any 

text_xml 


注意

National Language Support(「NLS」または「グローバリゼーション・サポート」とも呼ばれます)文字がSQL SYS.XMLTYPEの値で使用されている場合は、正しく処理されない場合があります。 


REF CURSORを戻す問合せまたはPL/SQLファンクションは、nameBeansnameXMLRowSetおよびnameXMLの3つのメソッドにマッピングされます。nameは問合せまたはPL/SQLファンクションの名前です。

OUTおよびIN OUT PL/SQLパラメータの両方が、WSDLファイルのIN OUTパラメータにマッピングされます。

関連項目

 

表10-1には、2つの異なるマッピングが記載されている点に注意してください。useがliteralの場合とencodedの場合です。デフォルトのマッピングはliteralです。データベースWebサービスにとっては、encodedを使用する必要性は特にありません。encoded用のマッピングが提供されているのは、use="encoded"設定が必要になった場合に備えてです。特に指定のないかぎり、この章の説明では、use="literal"設定を使用していることを前提にしています。

数値型に関してのSQLからXMLへのマッピングの変更

表10-1は、コールインで使用するSQLからXMLへの型マッピングを定義しています。数値型のマッピングは、Oracle JPublisherによるSQL型のJava型へのマッピング方法によって決定されています。Oracle JPublisherのオプション-numbertypes=objectjdbcが、WebServicesAssemblerツールによってデフォルトで使用されています。このため、SQLの数値型に対応するXML型は、生成されるWSDLファイルではすべてNULL値可能として宣言されます。

Oracle JPublisherのマッピングを変更し、それによってXML型を変更するには、WebServicesAssemblerのjpubProp引数を使用できます。たとえば、次の引数をデータベースのWebServicesAssemblerのAntタスクで指定すると、SQLの数値型に対して生成されるXML型は、NULL値可能として宣言されることはなくなります。

jpubProp="numbertypes=jdbc"

一方で、oracleまたはbigdecimalnumbertypesオプションのターゲットとして指定すると、SQL数値型に対して生成されるXML型はすべてdecimalとなり、NULL値可能になります。

Webサービスのコールアウトで使用されるXMLからSQLへの型マッピング

データベースWebサービスのコールアウトでは、XML型がSQL型にマッピングされます。表10-2に、コールアウトで使用されるXMLからSQLへの型マッピングを示します。

表10-2    Webサービスのコールアウトで使用されるXMLからSQLへの型マッピング 
XML型  SQL型 

int 

NUMBER 

float 

NUMBER 

double 

NUMBER 

decimal 

NUMBER 

dateTime 

DATE 

String 

VARCHAR2 

byte[] 

RAW 

complexType 

SQL OBJECT 

Array 

SQL TABLE 

text_xml 

XMLType 

データベース・リソースを公開するWebサービスの開発

この項では、PL/SQLストアド・プロシージャ、SQL文、Oracle Streams AQキューおよびサーバー・サイドJavaクラスとして実装されるWebサービスの開発方法について説明します。

Webサービスのコールインのライフ・サイクルの使用方法

データベースWebサービスのコールイン・アプリケーションの作成は、ボトムアップ・プロセスです。多くの場合、既存のデータベース・アプリケーション(PL/SQLパッケージまたはJavaアプリケーションなど)または操作スクリプト(SQL問合せ、DMLまたはAQなど)の再利用を考えるはずです。また、Webサービスとして公開するリソースをデータベースに移入することもできます。Webサービスのコールインは、通常次の各ステップを取ります。

  1. 公開するデータベース・リソースを決定し、使用可能にします。

    たとえば、リソースは次のいずれかの方法で提供できます。

    • PL/SQLパッケージのデータベースへのロード

    • SQL問合せまたはDML文Webサービスで使用するスキーマの作成

    • Javaクラスのデータベースへのロード(データベースのサーバー・サイドJava Webサービス用)

  2. WebServicesAssemblerツールを実行し、指定されたリソースをベースにしてWebサービスをアセンブルします。

    なお、Oracle JDeveloperを使用してもWebサービスをアセンブルできます。

  3. WebサービスのアセンブルでPL/SQLラッパーが生成された場合は、データベースにロードします。

    PL/SQLレコードまたは表タイプINDEX BYがPL/SQLパッケージに含まれている場合、PL/SQL Webサービスをアセンブルすると、ラッパーが生成されます。生成されたラッパーはデータベースにロードする必要があります。サーバー・サイドJavaのコールインをアセンブルすると、常にPL/SQLラッパーが生成されます。sysUser引数が設定されている場合、WebServicesAssemblerはラッパーを自動的にロードします。詳細は、sysUserを参照してください。

    なお、Oracle JDeveloperを使用してもPL/SQLラッパーをデータベースにロードできます。

  4. OC4Jデータソースを構成し、Webサービス実装を構成するOracle JPublisher生成のJavaクラスが、データベースおよび公開するリソースに確実に接続できるようにします。

    J2EEデータソース・ファイルにデータソース・エントリを追加し、Webサービス・アプリケーションがデータベースに接続できるようにします。

  5. Webサービス・アプリケーションをOC4Jの実行中インスタンスにデプロイします。

  6. 必要に応じて、デプロイメントが成功したかどうかを確認します。OracleAS Web Servicesでは、デプロイされたWebサービスごとにWebサービス・テスト・ページが提供されます。

    Webサービス・テスト・ページへのアクセスおよびその使用方法の詳細は、「Webサービス・テスト・ページの使用方法」を参照してください。

  7. WebServicesAssemblerツールを使用してWebサービス・クライアント・プロキシを生成し、クライアント・アプリケーションに組み込みます。

  8. クライアント・プロキシを使用してWebサービスを起動します。

Webサービスのコールインに対するWebServicesAssemblerのサポート

WebServicesAssemblerツールの次の引数は、Webサービスのコールイン・タイプのすべてに対して必須です。

appName引数には、Webサービス・アプリケーション名を指定します。dataSource引数は、アクセス対象のデータベース用に、データソースのJNDI位置を定義します。実行時には、Webサービスのコードは、このデータソースを介してデータベースにアクセスします。

WebServicesAssemblerツールは、Webサービス作成時に、dbConnectionおよびdbUser引数を使用してデータベースへの接続を定義します。これらの引数の値はコード生成時に使用され、実行時には使用されません。dbConnection引数は、公開対象のリソースに関する情報へのアクセスに使用します。たとえば、PL/SQLパッケージ、スキーマまたは問合せに関する情報へのアクセスに使用します。

Webサービスの作成時に使用するデータベースは、実行時に使用するデータベースと同じである必要はありません。ただし、どちらにも公開対象のデータベース・リソースを含むスキーマがある必要があります。

実行時には、データベースWebサービスはこのデータソースからデータベースへの接続を取得します。データベースWebサービスは、接続が失われるとデータベースへの再接続を行います。接続の状態が無効になると、Webサービスは接続の再確立を試行します。Webサービスは、再接続に失敗すると、フォルトを戻します。その次の回にクライアントがWebサービスを起動すると、Webサービスはデータベースへの接続を試行します。したがって、接続失敗の処理が原因でWebサービスが一時的にフォルトを戻しても、その後正常に接続できる場合があります。

次の引数はオプションであり、Webサービスのすべてのコールインのケースで使用できます。

公開対象リソースがデータベースに移入されていることが、すべてのコールインタイプに共通の前提条件になります。WebServicesAssemblerはOracle JPublisherを使用し、データベース・リソースにアクセスするJavaコードを生成します。jpubProp引数は、コマンドラインまたはAntタスクで複数回使用でき、Oracle JPublisherにオプションを渡します。

関連資料

Oracle JPublisherオプションのリスト、およびPL/SQL、SQL型、SQL文およびサーバー・サイドJavaのクライアント・サイドJavaラッパーへのマッピング方法は、『Oracle Database JPublisherユーザーズ・ガイド』を参照してください。 

PL/SQLパッケージからのWebサービスのアセンブル方法

plsqlAssembleコマンドを使用して、WebサービスをPL/SQLストアド・プロシージャからアセンブルします。生成されるWebサービスでは、各Webサービス操作が1つのPL/SQLストアド・プロシージャに対応します。

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

前提条件

開始する前に、次のファイルと情報を用意してください。

PL/SQLパッケージからWebサービスをアセンブルする手順

次の手順は、PL/SQLパッケージecho_plsqlに対するWebサービスのアセンブル方法について説明しています。

  1. 「前提条件」の項で説明したPL/SQLパッケージおよび情報をWebServicesAssemblerのplsqlAssembleコマンドに入力します。

    コマンドライン:

    java -jar wsa.jar 
        -plsqlAssemble 
        -appName Echo 
        -sql echo_plsql 
        -dataSource jdbc/OracleManagedDS 
        -dbConnection jdbc:oracle:thin:@stacd15:1521:lsqlj 
        -dbUser scott/tiger
        -style rpc 
        -use encoded
    

    Antタスク:

    <oracle:plsqlAssemble
        dbUser="scott/tiger"
        sql="echo_plsql"
        dbConnection="jdbc:oracle:thin:@stacd15:1521:1sqlj"
        dataSource="jdbc/OracleManagedDS"
        appName="EchoPlsql"
        style="rpc"
        use="encoded"
    />
    

    このコマンドおよびAntタスクの説明:

    • plsqlAssemble: ストアド・プロシージャとファンクションを含むPL/SQLパッケージからWebサービスを生成します。このコマンドを使用するには、データベースに接続する必要があります。「plsqlAssemble」を参照してください。

    • appName: アプリケーションの名前を指定します。この名前は、通常contexturiなどの他の引数のベース値として使用されます。「appName」を参照してください。

    • sql: PL/SQLのパッケージ名を指定します。「sql」を参照してください。

    • dataSource: 実行時にWebサービスによって使用されるデータソースのJNDI位置を指定します。「dataSource」を参照してください。

    • dbConnection: データベースのJDBC URLを指定します。「dbConnection」を参照してください。

    • dbUser: user/passwordの形式でデータベースのスキーマとパスワードを指定します。「dbUser」を参照してください。

    • style: ボトムアップ方式Webサービス・アセンブリの場合、この引数は、生成されるWSDL内のメッセージ書式のstyle属性を指定します。「style」を参照してください。

    • use: ボトムアップ方式Webサービス・アセンブリの場合、この引数は、生成されるWSDL内のメッセージ書式のuse属性を指定します。「use」を参照してください。

    plsqlAssembleコマンドで使用可能な引数は、「plsqlAssemble」を参照してください。

    デフォルトでは、WebServicesAssemblerはdocument-wrappedスタイルを使用してサービスを生成します。ただし、document-wrappedスタイルを使用するJAX-RPCクライアントは、IN OUTパラメータを直接サポートしません。WebServicesAssemblerはそのかわりに、INパラメータとIN OUTパラメータを個別にパッケージ化します。この例で使用されているPL/SQLパッケージは、IN OUTパラメータを含んでおり、plsqlAssembleコマンドには-style rpc引数が含まれています。パラメータおよび各種ドキュメント・スタイルの詳細は、「クライアント・コードからPL/SQLのINおよびIN OUTパラメータにアクセスする方法」を参照してください。

    このコマンドにより、Webサービス・アプリケーションEchoPlsql.earが生成されるとともに、オプションで次のPL/SQLスクリプトが生成されます。

    • Echo_plsql_wrapper.sql: PL/SQLレコードおよびINDEX BY表をサポートするために生成されるPL/SQLラッパー

    • Echo_plsql_dropper.sql: ラッパー・スクリプトで作成される型およびパッケージを削除するPL/SQLスクリプト

  2. Webサービスの生成中に作成されたPL/SQLラッパーをすべてデータベースにインストールします。

    PL/SQL WebサービスのアセンブリではPL/SQLラッパーが生成されない場合もあります。生成された場合は、Webサービスの実行前にデータベースの適切なユーザー・スキーマにロードする必要があります。

    ラッパーは自動または手動でロードできます。ラッパーを自動でロードするには、次の行をplsqlAssembleコマンドに追加します。

    -jpubProp plsqload(コマンドラインの場合)、または

    jpubprop="plsqlload"(Antタスクの場合)

    Webサービスのアセンブリ後にラッパー・パッケージを手動でロードするには、SQL*PLUSを使用します。次のコマンドラインは、ラッパー・パッケージをロードするためのサンプルSQL*PLUSコマンドです。

    SQL>@Echo_plsql_wrapper.sql
    
  3. サービスをOC4Jの実行中インスタンスにデプロイし、アプリケーションをバインドします。

    ステップ1の-dataSource引数で参照しているデータソースがこのOC4Jインスタンスに設定されている必要があります。

    次のコマンドラインは、サンプルのデプロイおよびバインドのコマンドです。

    % java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome 
    -deploy -file dist/echo.ear -deploymentName echo
    % java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome 
    -bindWebApp plsql plsql-web default-web-site /plsql
    

    この例において、<J2EE_HOME>は、J2EEのインストール・ディレクトリです。

    EARファイルのデプロイの詳細は、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。

  4. (オプション)デプロイが成功したことを確認します。

    OracleAS Web Servicesでは、デプロイされたWebサービスごとにWebサービス・テスト・ページが提供されます。Webサービス・テスト・ページへのアクセスおよびその使用方法の詳細は、「Webサービス・テスト・ページの使用方法」を参照してください。

  5. クライアント・サイド・コードを生成します。

    • J2SE環境の場合、genProxyコマンドを使用してWebServicesAssemblerツールを実行し、J2SE Webサービス・クライアントのスタブ(クライアント・プロキシ)を生成します。J2SE環境向けのクライアント・サイド・コードの生成およびアセンブルの詳細は、第15章「J2SE Webサービス・クライアントのアセンブル」を参照してください。

    • J2EE環境の場合、genInterfaceコマンドを使用してWebServicesAssemblerツールを実行し、J2EE Webサービス・クライアント用のJAX-RPCマッピング・ファイルおよびサービス・エンドポイント・インタフェースを生成します。クライアント・サイド・コードの生成およびアセンブルの詳細は、第14章「J2EE Webサービス・クライアントのアセンブル」を参照してください。

    たとえば、次のコマンドはgenProxyコマンドを使用してJ2SEクライアントをbuild/classes/clientディレクトリに生成します。

    % java -jar wsa.jar -genProxy 
                        -wsdl http://locahost:8888/plsql/echo?WSDL 
                        -output build/src/client 
                        -mappingFileName ./mapping.xml 
                        -packageName oracle.demo.db.plsql.stub 
                        -unwrapParameters true
    

    このコマンドの説明:

    • genProxy: J2SE Webサービス・クライアントから使用可能な静的プロキシ・スタブを作成します。「genProxy」を参照してください。

    • wsdl: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。「wsdl」を参照してください。

    • output: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。

    • mappingFileName: JAX-RPCマッピング・ファイルを指すファイル位置を指定します。「mappingFileName」を参照してください。

    • packageName: JAX-RPCマッピング・ファイルにパッケージ名が宣言されていない場合に、生成されたクラス用に使用されるパッケージ名を指定します。「packageName」を参照してください。

    • unwrapParameters: この引数はdocument-literal操作に対してのみ設定でき、その他のメッセージ書式では無視されます。unwrapParameterstrueに設定すると(デフォルト)、戻り型とレスポンス・タイプがアンラップされます。通常はこの方が使いやすくなります。特にタイプが単純な場合はそうです。「unwrapParameters」を参照してください。

  6. クライアントをコンパイルおよび実行します。

    クライアントをコンパイルする前に、クラスパス上にある適切なJARをリストします。クライアントのクラスパスで使用可能なすべてのJARファイルのリストについては、表A-2「クライアント・サイド・プロキシを使用するクライアントのクラスパス・コンポーネント」を参照してください。個々のJARをリストするかわりに、クライアントのクラスパスにクライアント側のJARとしてwsclient_extended.jarを含めることができます。このJARファイルには、Webサービス・クライアントをコンパイルおよび実行するために必要なすべてのクラスが含まれます。これらのクラスは、表A-2にリストされている各JARファイルに含まれているものです。wsclient_extended.jarおよびクライアントのクラスパスの詳細は、「Webサービス・プロキシのクラスパスの設定」を参照してください。

    次のコマンドラインは、サンプルのコンパイルおよび実行のコマンドです。

     % javac -classpath path:
             <ORACLE_HOME>/webservices/lib/wsclient_extended.jar:
             :<ORACLE_HOME>/webservices/lib/jaxrpc-api.jar EchoClient.java
    
    % java -classpath path:
           <ORACLE_HOME>/webservices/lib/wsclient_extended.jar:
           <ORACLE_HOME>/webservices/lib/jaxrpc-api.jar:
           <J2EE_HOME>/lib/jax-qname-namespace.jar:
           <J2EE_HOME>/lib/activation.jar:
           <J2EE_HOME>/lib/mail.jar:
           <J2EE_HOME>/lib/http_client.jar:
           <ORACLE_HOME>/lib/xmlparserv2.jar EchoClient
    

    この例において、<J2EE_HOME>はJ2EEのインストール・ディレクトリであり、<ORACLE_HOME>にOracleAS Web Servicesがインストールされています。

サンプルPL/SQLパッケージ

例10-1は、Webサービスとして公開可能な、データベース内のPL/SQLパッケージを示しています。このパッケージには、各種SQLおよびPL/SQLデータ型を使用するプロシージャおよびファンクションが含まれています。

例10-1    サンプルPL/SQLパッケージ

create or replace type address as object( 
     street varchar2(30), city varchar2(30), state varchar2(2), zip varchar2(5));
create or replace type employee as object (eid int, efirstname varchar(30),
     elastname varchar(30), addr address, salary float);
create table employees (eid int, emp employee);
create table employee_espp (eid int, status int);
create table employee_accounts (eid int, accounts sys.xmltype);
create table employee_biodata (eid int, biodata CLOB);
create table employee_image (eid int, image BLOB);
create table employee_hiredate(eid int, hiredate TIMESTAMP);
                                                              
create or replace package echo_plsql as
procedure set_object (emp IN employee);
function get_object1(id IN int) return employee;
function get_object2(id IN int) return address;
function hold_varchar(id IN int, firstname OUT varchar2, lastname OUT varchar2) return 
float;
procedure set_boolean(id IN int , status IN boolean);
function get_boolean(id IN int) return boolean;
procedure hold_float_inout(id IN int, newsalary IN OUT float);
procedure clear_object (id IN int);
procedure set_clob (id int, biodata IN CLOB);
function get_clob(id IN int) return CLOB;
procedure set_blob(id int, image IN BLOB);
function get_blob(id IN int) return BLOB;
procedure set_xmltype(id IN number, accounts sys.xmltype);
function get_xmltype(id IN number) return sys.xmltype;
procedure set_date(id IN int, hiredate IN TIMESTAMP);
function get_date(id IN int) return TIMESTAMP;
TYPE rec is RECORD (emp_id int, manager_id int);
TYPE index_tbl is TABLE OF rec INDEX BY BINARY_INTEGER;
function echo_rec(mrec rec) return rec;
function echo_index_tbl(mtbl index_tbl) return index_tbl;
end echo_plsql;

PL/SQLのファンクション名がWebサービスの操作名にマップされる方法

WebServicesAssemblerは、PL/SQLのファンクションまたはプロシージャをWebサービス操作にマッピングします。このとき、通常は名前が変更されます。通常、PL/SQL名のアンダースコアが取り除かれ、アンダースコアの次の文字が大文字になります。たとえば、例10-1のPL/SQLファンクションecho_index_tblに注目してみます。このファンクションはWebサービス操作echoIndexTblにマッピングされます。例10-2のWSDLフラグメントでは、PL/SQLファンクションecho_index_tblがWebサービス操作echoIndexTblとして表現されています。

例10-2    PL/SQLファンクションのマッピングを示すWSDLフラグメント

<operation name="echoIndexTbl" parameterOrder="EchobaseIndexTblBase_1">
<input message="tns:Echo_echoIndexTbl"/>
<output message="tns:Echo_echoIndexTblResponse"/>
</operation>

クライアント・コードからPL/SQLのINおよびIN OUTパラメータにアクセスする方法

例10-1のPL/SQLパラメータOUTおよびIN OUTは、XMLではIN OUTパラメータとして表現されており、holdVarcharのホルダー・パラメータとして使用されています。例10-3のWSDLフラグメントのエントリはholdVarchar操作を示しています。2番目および3番目のパラメータは入力メッセージおよび出力メッセージの両方で使用されており、どちらのパラメータもIN OUTパラメータであることがわかります。

例10-3    IN OUTパラメータを示すWSDLフラグメント

<operation name="holdVarchar"
   parameterOrder="Integer_1 String_2 String_3">
  <input message="tns:Echo_holdVarchar"/>
  <output message="tns:Echo_holdVarcharResponse"/>
</operation>
<message name="Echo_holdVarchar">
<part name="Integer_1" type="xsd:int"/>
<part name="String_2" type="xsd:string"/>
<part name="String_3" type="xsd:string"/>
</message> 
<message name="Echo_holdVarcharResponse">
<part name="result" type="ns1:double"/>
<part name="String_2" type="xsd:string"/>
<part name="String_3" type="xsd:string"/>
</message>

JAX-RPCクライアント・コードのIN OUTパラメータにアクセスするには、JAX-RPCホルダーを使用する必要があります。たとえば、例10-4のコードは戻り値をfirstName.valueおよびlastName.valueとして取得します。ここでfirstNameおよびlastNameはどちらもStringホルダーです。ホルダーの実際の値には、println文で示しているようにメンバーvalueを使用してアクセスします。

例10-4    JAX-RPCホルダーを使用する、クライアント・コードのIN OUTパラメータへのアクセス

System.out.println("holdVarchar");
StringHolder firstName = new StringHolder("Tom");
StringHolder lastName = new StringHolder("Gordon");
System.out.println("Holder returned:  empid="
+ ci.holdVarchar(id, firstName, lastName)
+ ", name="
+ firstName.value
+ "."
+ lastName.value);

plsqlAssembleコマンドラインに-style rpcが指定されている点に注意してください。rpcスタイルではホルダーがサポートされています。デフォルトのdocument-wrappedスタイルではホルダーはサポートされていません。

Webサービスがデフォルトのdocument-wrappedスタイルを使用して作成されている場合は、異なるholdVarcharシグネチャが生成されています。OUT引数は属性として戻り値に取得されます。

次のWSDLセグメントはdocument-wrappedスタイルにおけるholdVarchar操作を示しています。戻り型EchoUser_holdVarchar_Outでは、属性lastnameOutおよびfirstnameOutに、PL/SQLパラメータfirstnameおよびlastnameOUT値が記録されます。

例10-5    document-wrappedスタイルで処理されるIN OUTパラメータを示すWSDLフラグメント

<operation name="holdVarchar" parameterOrder="Integer_1">
            <input message="tns:Echo_holdVarchar"/>
            <output message="tns:Echo_holdVarcharResponse"/>
 </operation>
 
<message name="Echo_holdVarchar">
  <part name="Integer_1" type="xsd:int"/>
</message>
<message name="Echo_holdVarcharResponse">
  <part name="result" type="tns:Echo_holdVarchar_Out"/>
</message>
 
<complexType name="Echo_holdVarchar_Out">
     <sequence>
         <element name="return" type="double" nillable="true"/>
        <element name="lastnameOut" type="string" nillable="true"/>
         <element name="firstnameOut" type="string" nillable="true"/>
     </sequence>
</complexType>

クライアント・コードからSQLのXMLType型にアクセスする方法

例10-1のSQL XMLTypeは、XML any型にマッピングされます。このマッピングは、例10-6のWSDLフラグメントのgetXmltype操作で示されています。

例10-6    SQL XMLTypeのtext_xmlへのマッピングを示すWSDLフラグメント

<message name="Echo_getXmltypeResponse">
<part name="result" type="ns2:any"/>
</message>
<operation name="getXmltype" parameterOrder="BigDecimal_1">
<input message="tns:Echo_getXmltype"/>
<output message="tns:Echo_getXmltypeResponse"/>
</operation>

WebServicesAssemblerは、XML anyをJava型org.w3c.org.dom.Elementにマッピングするプロキシを生成します。したがって、JavaクライアントはSQL XMLTypeインスタンスにElementインスタンスとしてアクセスします。

SQL問合せまたはDML文からWebサービスをアセンブルする方法

sqlAssembleコマンドを使用して、WebサービスをSQL文から生成します。文にはSQL問合せおよびDML(Data Manipulation Language)文を含むことができます。

PL/SQL Webサービスの生成とは異なり、SQL文をアセンブルしても、PL/SQLラッパーは生成されません。PL/SQLラッパーはPL/SQLレコードまたはINDEX BY表タイプを処理する場合のみ生成されます。これらのタイプはSQL文では使用されません。

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

前提条件

開始する前に、次のファイルと情報を用意してください。

SQL文または問合せからWebサービスをアセンブルする手順

次の手順では、sqlAssembleコマンドを使用し、SCOTTスキーマに基づいて問合せおよび文のWebサービスをアセンブルします。

  1. 「前提条件」の項で説明したSQL文または問合せ、それらの対象となるデータベースの名前およびパスワード、およびその他の情報を、WebServicesAssemblerのsqlAssembleコマンドに対する入力として使用します。

    たとえば、次のコマンドはWebサービス・アプリケーションquery.earを生成します。

    コマンドライン:

    java -jar wsa.jar -sqlAssemble
       -appName query
       -dataSource jdbc/OracleManagedDS
       -sqlstatement "getEmpCount=select ename, sal from emp where 
                          sal>:{mysal NUMBER}" 
       -sqlstatement "getEmpBySal=select ename, sal from emp where 
                          sal>:{mysal NUMBER}"
       -sqlstatement "updateEmp=update emp SET sal=sal+500 where 
                          ename=:{myname VARCHAR}"
       -dbConnection jdbc:oracle:thin:@stacd15:1521:lsqlj
       -dbUser scott/tiger
    

    Antタスク:

    <oracle:sqlAssemble
            appName="query"
            dataSource="jdbc/OracleManagedDS"
            dbConnection="jdbc:oracle:thin:@dsunrde22:1521:sqlj"
            dbUser="scott/tiger">
            <sqlstatement="getEmpCount=select ename, sal from emp where sal>:{mysal 
    NUMBER}"/>
            <sqlstatement="getEmpBySal=select ename, sal from emp where sal>:{mysal 
    NUMBER}"/>
            <sqlstatement="updateEmp=update emp SET sal=sal+500 where  ename=:{myname 
    VARCHAR}"/>
    />
    

    このコマンドおよびAntタスクの説明:

    • sqlAssemble: SQL問合せやデータ操作言語(DML)などのSQL文からWebサービスを生成します。このコマンドを使用するには、データベースに接続する必要があります。「sqlAssemble」を参照してください。

    • appName: アプリケーションの名前を指定します。この名前は、通常contexturiなどの他の引数のベース値として使用されます。「appName」を参照してください。

    • dataSource: 実行時にWebサービスによって使用されるデータソースのJNDI位置を指定します。「dataSource」を参照してください。

    • dbConnection: データベースのJDBC URLを指定します。「dbConnection」を参照してください。

    • dbUser: user/passwordの形式でデータベースのスキーマとパスワードを指定します。「dbUser」を参照してください。

    • sqlStatement: Webサービスとして公開するDML文またはSQL問合せを指定します。「sqlstatement」を参照してください。

  2. サービスをOC4Jの実行中インスタンスにデプロイし、アプリケーションをバインドします。

    -dataSource引数で参照しているデータソースがこのOC4Jインスタンスに設定されている必要があります。

    次のコマンドラインは、サンプルのデプロイおよびバインドのコマンドです。

    % java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome 
    -deploy -file dist/query.ear -deploymentName query
    
    % java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome 
    -bindWebApp plsql plsql-web default-web-site /query
    

    このサンプル・コマンドラインの<J2EE_HOME>は、J2EEのインストール・ディレクトリです。

    EARファイルのデプロイの詳細は、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。

  3. 必要に応じて、デプロイメントが成功したかどうかを確認します。OracleAS Web Servicesでは、デプロイされたWebサービスごとにWebサービス・テスト・ページが提供されます。Webサービス・テスト・ページへのアクセスおよびその使用方法の詳細は、「Webサービス・テスト・ページの使用方法」を参照してください。

  4. クライアント・サイド・コードを生成します。

    • J2SE環境の場合、genProxyコマンドを使用してWebServicesAssemblerツールを実行し、J2SE Webサービス・クライアントのスタブ(クライアント・プロキシ)を生成します。J2SE環境向けのクライアント・サイド・コードの生成およびアセンブルの詳細は、第15章「J2SE Webサービス・クライアントのアセンブル」を参照してください。

    • J2EE環境の場合、genInterfaceコマンドを使用してWebServicesAssemblerツールを実行し、J2EE Webサービス・クライアント用のJAX-RPCマッピング・ファイルおよびサービス・エンドポイント・インタフェースを生成します。クライアント・サイド・コードの生成およびアセンブルの詳細は、第14章「J2EE Webサービス・クライアントのアセンブル」を参照してください。

    たとえば、次のコマンドはgenProxyを使用してJ2SEクライアントのコードを生成します。

    % java -jar wsa.jar -genProxy 
                        -wsdl http://locahost:8888/query/query?WSDL 
                        -output build/src/client 
                        -mappingFileName ./mapping.xml 
                        -packageName oracle.demo.db.query.stub 
                        -unwrapParameters true
    

    このコマンドはディレクトリbuild/src/clientにクライアントを生成します。

    このコマンドの説明:

    • genProxy: J2SE Webサービス・クライアントから使用可能な静的プロキシ・スタブを作成します。「genProxy」を参照してください。

    • wsdl: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。「wsdl」を参照してください。

    • output: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。

    • mappingFileName: JAX-RPCマッピング・ファイルを指すファイル位置を指定します。「mappingFileName」を参照してください。

    • packageName: JAX-RPCマッピング・ファイルにパッケージ名が宣言されていない場合に、生成されたクラス用に使用されるパッケージ名を指定します。「packageName」を参照してください。

    • unwrapParameters: この引数はdocument-literal操作に対してのみ設定でき、その他のメッセージ書式では無視されます。unwrapParameterstrueに設定すると(デフォルト)、戻り型とレスポンス・タイプがアンラップされます。通常はこの方が使いやすくなります。特にタイプが単純な場合はそうです。「unwrapParameters」を参照してください。

  5. クライアントをコンパイルおよび実行します。

    クライアントをコンパイルする前に、クラスパス上にある適切なJARをリストします。クライアントのクラスパスで使用可能なすべてのJARファイルのリストについては、表A-2「クライアント・サイド・プロキシを使用するクライアントのクラスパス・コンポーネント」を参照してください。個々のJARをリストするかわりに、クライアントのクラスパスにクライアント側のJARとしてwsclient_extended.jarを含めることができます。このJARファイルには、Webサービス・クライアントをコンパイルおよび実行するために必要なすべてのクラスが含まれます。これらのクラスは、表A-2にリストされている各JARファイルに含まれているものです。wsclient_extended.jarおよびクライアントのクラスパスの詳細は、「Webサービス・プロキシのクラスパスの設定」を参照してください。

    次のコマンドラインは、サンプルのコンパイルおよび実行のコマンドです。

    % javac -classpath path:
         <ORACLE_HOME>/webservices/lib/wsclient_extended.jar: 
         :<ORACLE_HOME>/webservices/lib/jaxrpc-api.jar QueryClient.java
     
    % java -classpath path
         <ORACLE_HOME>/webservices/lib/wsclient_extended.jar:
         <ORACLE_HOME>/webservices/lib/jaxrpc-api.jar:
         <J2EE_HOME>/lib/jax-qname-namespace.jar:
         <J2EE_HOME>/lib/activation.jar:
         <J2EE_HOME>/lib/mail.jar:
         <J2EE_HOME>/lib/http_client.jar:
         <ORACLE_HOME>/webservices/lib/commons-logging.jar:
         <ORACLE_HOME>/lib/xmlparserv2.jar QueryClient 
    

この例において、<J2EE_HOME>はJ2EEのインストール・ディレクトリであり、<ORACLE_HOME>はOC4Jのインストール・ディレクトリです。

サンプルのSQL文

例10-7は、Webサービスとして公開されるSQL文の定義を示しています。

例10-7    サンプルのSQL文

getEmpCount=select ename, sal from emp where sal>:{mysal NUMBER}
getEmpBySal=select ename, sal from emp where sal>:{mysal NUMBER}
updateEmp=update emp SET sal=sal+500 where  ename=:{myname VARCHAR}

SQL問合せがWebサービスの操作名にマッピングされる方法

SQL問合せは、Webサービスとして公開されると、3つのサービス操作にマッピングされます。たとえば、例10-7getEmpBySal問合せにより、次のサービス操作が生成されます。

1つの問合せから3つの操作が生成されるので、便利です。戻り値の違いは形式のみです。なお、オリジナルの問合せ名にBeansXMLRowSetおよびXMLを付加するネーミング規則になっています。

例10-8のWSDLフラグメントでは、WSDLファイルの3つの操作の戻り型を説明しています。

例10-8    SQL問合せのサービス操作を示すWSDLフラグメント

<complexType name="getEmpBySalBeansResponse">
<sequence>
<element name="result" type="tns:Query_getEmpBySalRowUser" nillable="true"
     minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="Query_getEmpBySalRowUser">
<sequence>
<element name="ename" type="string" nillable="true"/>
<element name="sal" type="decimal" nillable="true"/>
</sequence>
</complexType>

<complexType name="getEmpBySalXMLRowSetResponse">
<sequence>
<element name="result" type="ns1:swaRef" nillable="true"/>
</sequence>
</complexType>
 
<complexType name="getEmpBySalXMLResponse">
<sequence>
<element name="result" type="xsd:any" nillable="true"/>
</sequence>
</complexType>

getEmpBySalXMLRowSetResponseおよびgetEmpBySalXMLResponseの2つのメソッドはswaRef型のパラメータを持ちます。この型に対して、アセンブラはクライアント・プロキシにjavax.xml.soap.AttachmentPartを生成します。戻される問合せ結果にアクセスするクライアント・コードを例10-9に示します。

例10-9    swaRef型に対して戻される問合せ結果への、クライアント・コードからのアクセス

import oracle.jdbc.pool.OracleDataSource;
import oracle.jdbc.rowset.OracleWebRowSet;
import javax.xml.soap.AttachmentPart;
import org.w3c.org.Element;
import javax.xml.transform.dom.*;
import java.io.*;
   ...
 
/* Access the query result as Oracle XDB RowSet */
Element element = eme.getEmpBySalXML(new BigDecimal(500));
DOMSource doms = new javax.xml.transform.doc.DOMSource(element);
buf = new jav.io.ByteArrayOutputStream();
StreamResult streamr = new StreamResult(buf);
trnas.transform(doms, streamr);
System.out.println(buf, toString());


/* Access the query result as Oracle WebRowSet */
ap = eme.getEmpBySalXMLRowSet(new BigDecimal(500));
source = (Source) ap.getContent();
trans = TransformerFactory.newInstance().newTransformer();
buf = new ByteArrayOutputStream();
streamr = new StreamResult(buf);
trans.transform(source, streamr);
InputStream istream = new ByteArrayInputStream(buf.toString().getBytes());
OracleWebRowSet rowset = new OracleWebRowSet();
System.setProperty("http.proxyHost", "www-proxy.us.oracle.com");
System.setProperty("http.proxyPort", "80");
         System.setProperty("javax.xml.parsers.DocumentBuilderFactory", 
"oracle.xml.jaxp.JXDocumentBuilderFactory");
rowset.readXml(new InputStreamReader(istream));
rowset.writeXml(new PrintWriter(System.out));

例10-9のコードは、問合せ結果をOracle XDB行セット(ROWSET)およびOracle Web行セット(OracleWebRowSet)の2つの形式で表示します。例10-10では問合せ結果をOracle XDB行セットで表示しています。例10-11では結果をWebRowSet形式で出力しています。実際には、oracle.jdbc.rowset.OracleWebRowSet APIを使用して、例10-9の可変行セットであるOracleWebRowSetインスタンスにアクセスします。

関連資料

これらのデータ型の詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。 

例10-10    問合せ結果(Oracle XDB行セット書式)

<ROWSET>
<ROW num="1">
<ENAME>SMITH</ENAME><SAL>800</SAL>
</ROW>
<ROW num="2">
<ENAME>ALLEN</ENAME><SAL>1600</SAL>
</ROW>
<ROW num="3">
<ENAME>WARD</ENAME><SAL>1250</SAL>
</ROW>
</ROWSET>

例10-11    問合せ結果(JDBC Web行セット書式)

<?xml version="1.0" encoding="UTF-8"?> <webRowSet xmlns="http://java.sun.com/xml/ns/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/jdbc http://java.sun.com/xml/ns/jdbc/webrowset.xsd"> <properties> <command></command> <concurrency>1007</concurrency> <datasource></datasource> <escape-processing>true</escape-processing> <fetch-direction>1002</fetch-direction> <fetch-size>10</fetch-size> <isolation-level>2</isolation-level> <key-columns> </key-columns> <map> </map> <max-field-size>0</max-field-size> <max-rows>0</max-rows> <query-timeout>0</query-timeout> <read-only>false</read-only><rowset-type>1005</rowset-type> <show-deleted>false</show-deleted> <table-name></table-name> <url>jdbc:oracle:thin:@stacd15:1521:lsqlj1</url> <sync-provider> <sync-provider-name>com.sun.rowset.providers.RIOptimisticProvider</sync-provider-name> <sync-provider-vendor>Sun Microsystems Inc.</sync-provider-vendor> <sync-provider-version>1.0</sync-provider-version> <sync-provider-grade>2</sync-provider-grade> <data-source-lock>1</data-source-lock> </sync-provider> </properties> <metadata> <column-count>2</column-count> <column-definition> <column-index>1</column-index> <auto-increment>false</auto-increment> <case-sensitive>true</case-sensitive> <currency>false</currency> <nullable>1</nullable> <signed>true</signed> <searchable>true</searchable> <column-display-size>10</column-display-size> <column-label>ENAME</column-label> <column-name>ENAME</column-name> <schema-name></schema-name> <column-precision>0</column-precision> <column-scale>0</column-scale> <table-name></table-name> <catalog-name></catalog-name> <column-type>12</column-type> <column-type-name>VARCHAR2</column-type-name> </column-definition> <column-definition> <column-index>2</column-index> <auto-increment>false</auto-increment> <case-sensitive>true</case-sensitive> <currency>false</currency> <nullable>1</nullable> <signed>true</signed> <searchable>true</searchable> <column-display-size>10</column-display-size> <column-label>SAL</column-label> <column-name>SAL</column-name> <schema-name></schema-name> <column-precision>0</column-precision> <column-scale>0</column-scale> <table-name></table-name> <catalog-name></catalog-name> <column-type>2</column-type> <column-type-name>NUMBER</column-type-name> </column-definition> </metadata> <data> <currentRow> <columnValue>SMITH</columnValue> <columnValue>800</columnValue> </currentRow> <currentRow> <columnValue>ALLEN</columnValue> <columnValue>1600</columnValue> </currentRow> <currentRow> <columnValue>WARD</columnValue> <columnValue>1250</columnValue> </currentRow> </data> </webRowSet>

DML操作がWebサービス操作にマッピングされる方法

DML文はUPDATEDELETEまたはINSERT SQL文です。sqlAssembleコマンドを使用して、DML文をWebサービスの操作として公開できます。DML操作は正常終了すると自動的にコミットされ、エラーがあった場合は自動的にロールバックされます。

例10-12は、例10-7のDML文を公開するWSDLフラグメントです。

updateEmp=update emp SET sal=sal+500 where ename=:{myname VARCHAR}

このDML文は2つの操作として公開されています。この例では、updateEmpによりDML文が実行されますが、updateEmpiSによっても同じものがバッチ・モードで実行されます。バッチ操作では、オリジナルの各DML引数の配列を使用します。配列の各要素がバッチの1実行として使用されます。バッチ操作の結果は、バッチで更新される行の合計数になります。

例10-12    DML操作のレスポンス・タイプを示すWSDLフラグメント

    <message name="SqlStmts_updateEmp">
      <part name="salary" type="xsd:string"/>
  </message>
  <message name="SqlStmts_updateSchemaResponse">
      <part name="result" type="xsd:int"/>
  </message>
  <message name="SqlStmts_updateEmpiS">
      <part name="salary" type="tns:ArrayOfstring"/>
  </message>
  <message name="SqlStmts_updateEmpiSResponse">
      <part name="result" type="xsd:int"/>
  </message>

Oracle Streams AQからWebサービスをアセンブルする方法

Oracle Streamsアドバンスト・キューイングは、Oracleデータベースが提供する非同期メッセージング・システムです。アドバンスト・キュー(AQ)をWebサービスとして公開することにより、クライアントはメッセージをデータベース内の受信者、つまり、同じWebサービスの別のクライアントに送信できます。

WebServicesAssemblerツールは、データベース内の既存のAQからWebサービスを生成できます。AQはシングル・コンシューマまたは複数のコンシューマを持つことができます。シングル・コンシューマは、通常のいわゆるキューのことです。複数のコンシューマを持つAQは、通常のいわゆるトピックのことです。各Oracle Streams AQはキュー表に格納されています。キュー表は、格納しているすべてのAQのペイロード・タイプを定義し、AQがキューのみをサポートするか、またはトピックもサポートするのかも定義します。生成されるJavaコードでは、Oracle Streams AQ JMS APIが使用されます。

WebServicesAssemblerがキューおよびトピックに関して公開するWebサービス操作の例は、それぞれ例10-14および例10-15を参照してください。アセンブラはOracle Streams AQおよびAQ JMS APIをベースにして操作を作成します。

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

前提条件

開始する前に、次のファイルと情報を用意してください。

Oracle AQからのWebサービスをアセンブルする手順

次の手順は、WebServicesAssemblerを使用してOracle AQキューからWebサービスをアセンブルする方法を示しています。

  1. 「前提条件」の項で説明したファイルおよびその他の情報を、WebServicesAssemblerの-aqAssembleコマンドに入力します。

    たとえば、次のコマンドはWebサービス・アプリケーションを作成し、queue.earファイルを現行ディレクトリに生成します。WebServicesAssemblerツールは、実行時にキューにアクセスするJavaファイルを生成します。「サンプルのAQキュー/トピックの宣言」に、AQ sample_queueの宣言の例を示します。

    コマンドライン:

    java -jar $ORACLE_HOME/webservices/lib/wsa.jar 
      -aqAssemble 
      -appName queue 
      -dataSource jdbc/OracleManagedDS 
      -portName assembleQueuePort
      -sql sample_queue 
      -dbConnection jdbc:oracle:thin:@stacd15:1521:lsqlj 
      -dbUser scott/tiger
    

    Antタスク:

    <aqAssemble
       appName="queue"
       dataSource="jdbc/OracleManagedDS"
       sql="sample_queue"
       portName="assembleQueuePort"
       dbConnection="jdbc:oracle:thin:@stacd15:1521:lsqlj"
       dbUser="scott/tiger"
    />
    

    宣言内のサンプル・トピックsample_topicは、sample_queueと同じようにパブリッシュできます(ただし、WebServicesAssemblerの別個の起動においてです)。異なる点は、aqAssembleコマンドのsql引数およびappName引数の値のみです。

    このコマンドおよびAntタスクの説明:

    • aqAssemble: データベースのアドバンスト・キューからWebサービスを生成します。このコマンドを使用するには、データベースに接続する必要があります。「aqAssemble」を参照してください。

    • appName: アプリケーションの名前を指定します。この名前は、通常contexturiなどの他の引数のベース値として使用されます。「appName」を参照してください。

    • dataSource: 実行時にWebサービスによって使用されるデータソースのJNDI位置を指定します。「dataSource」を参照してください。

    • portName: 「portName」を参照してください。

    • sql: PL/SQLのパッケージ名を指定します。「sql」を参照してください。

    • dbConnection: データベースのJDBC URLを指定します。「dbConnection」を参照してください。

    • dbUser: user/passwordの形式でデータベースのスキーマとパスワードを指定します。「dbUser」を参照してください。

  2. サービスをOC4Jの実行中インスタンスにデプロイし、アプリケーションをバインドします。

    この手順は、AQがOC4Jインスタンスのデータソースとして設定されていることを想定しています。

    次のコマンドラインは、サンプルのデプロイおよびバインドのコマンドです。

    % java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome 
    -deploy -file dist/queue.ear -deploymentName queue
    
    % java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome 
    -bindWebApp queue queue-web default-web-site /queue
    

    この例において、<J2EE_HOME>は、J2EEのインストール・ディレクトリです。

    EARファイルのデプロイの詳細は、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。

  3. (オプション)デプロイが成功したことを確認します。

    OracleAS Web Servicesでは、デプロイされたWebサービスごとにWebサービス・テスト・ページが提供されます。Webサービス・テスト・ページへのアクセスおよびその使用方法の詳細は、「Webサービス・テスト・ページの使用方法」を参照してください。

  4. クライアント・サイド・コードを生成します。

    • J2SE環境の場合、genProxyコマンドを使用してWebServicesAssemblerツールを実行し、J2SE Webサービス・クライアントのスタブ(クライアント・プロキシ)を生成します。J2SE環境向けのクライアント・サイド・コードの生成およびアセンブルの詳細は、第15章「J2SE Webサービス・クライアントのアセンブル」を参照してください。

    • J2EE環境の場合、genInterfaceコマンドを使用してWebServicesAssemblerツールを実行し、J2EE Webサービス・クライアント用のJAX-RPCマッピング・ファイルおよびサービス・エンドポイント・インタフェースを生成します。クライアント・サイド・コードの生成およびアセンブルの詳細は、第14章「J2EE Webサービス・クライアントのアセンブル」を参照してください。

    たとえば、次のコマンドはgenProxyを使用してJ2SEクライアントのコードを生成します。

    % java -jar wsa.jar -genProxy 
                        -wsdl http://locahost:8888/queue/queue?WSDL 
                        -output build/src/client 
                        -mappingFileName ./mapping.xml 
                        -packageName oracle.demo.db.queue.stub 
                        -unwrapParameters true
    

    このコマンドの説明:

    • genProxy: J2SE Webサービス・クライアントから使用可能な静的プロキシ・スタブを作成します。「genProxy」を参照してください。

    • wsdl: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。「wsdl」を参照してください。

    • output: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。

    • mappingFileName: JAX-RPCマッピング・ファイルを指すファイル位置を指定します。「mappingFileName」を参照してください。

    • packageName: JAX-RPCマッピング・ファイルにパッケージ名が宣言されていない場合に、生成されたクラス用に使用されるパッケージ名を指定します。「packageName」を参照してください。

    • unwrapParameters: この引数はdocument-literal操作に対してのみ設定でき、その他のメッセージ書式では無視されます。unwrapParameterstrueに設定すると(デフォルト)、戻り型とレスポンス・タイプがアンラップされます。通常はこの方が使いやすくなります。特にタイプが単純な場合はそうです。「unwrapParameters」を参照してください。

  5. クライアントをコンパイルおよび実行します。

    クライアントをコンパイルする前に、クラスパス上にある適切なJARをリストします。クライアントのクラスパスで使用可能なすべてのJARファイルのリストについては、表A-2「クライアント・サイド・プロキシを使用するクライアントのクラスパス・コンポーネント」を参照してください。個々のJARをリストするかわりに、クライアントのクラスパスにクライアント側のJARとしてwsclient_extended.jarを含めることができます。このJARファイルには、Webサービス・クライアントをコンパイルおよび実行するために必要なすべてのクラスが含まれます。これらのクラスは、表A-2にリストされている各JARファイルに含まれているものです。wsclient_extended.jarおよびクライアントのクラスパスの詳細は、「Webサービス・プロキシのクラスパスの設定」を参照してください。

    次のコマンドラインは、サンプルのコンパイルおよび実行のコマンドです。

    % javac -classpath path
    <ORACLE_HOME>/webservices/lib/wsclient_extended.jar: 
    :<ORACLE_HOME>/webservices/lib/jaxrpc-api.jar QueueClient.java
     
    % java -classpath path
    <ORACLE_HOME>/webservices/lib/wsclient_extended.jar:
    <ORACLE_HOME>/webservices/lib/jaxrpc-api.jar:
    <J2EE_HOME>/lib/jax-qname-namespace.jar:
    <J2EE_HOME>/lib/activation.jar:<J2EE_HOME>/lib/mail.jar:
    <J2EE_HOME>/lib/http_client.jar:
    <ORACLE_HOME>/webservices/lib/commons-logging.jar:
    <ORACLE_HOME>/lib/xmlparserv2.jar QueueClient
    

この例において、<J2EE_HOME>はJ2EEのインストール・ディレクトリであり、<ORACLE_HOME>はOracleAS Web Servicesのインストール・ディレクトリです。

サンプルのAQキュー/トピックの宣言

例10-13のPL/SQLスクリプトは、キューsample_queueおよびトピックsample_topicを定義しています。キューのペイロード・タイプはqueue_messageであり、SQLオブジェクト・タイプです。トピックのペイロード・タイプはtopic_messageであり、同様にSQLオブジェクト・タイプです。

例10-13    サンプルのキュー/トピック宣言

create type scott.queue_message as object (
   Subject                VARCHAR2(30),
   Text                   VARCHAR2(80));
create type scott.topic_message as object (
   Subject                VARCHAR2(30),
   Text                   VARCHAR2(80));
BEGIN
  dbms_aqadm.create_queue_table (
           Queue_table            => 'scott.queue_queue_table',
           Queue_payload_type     => 'scott.queue_message');
  dbms_aqadm.create_queue(
    queue_name  => 'scott.sample_queue',
    queue_table => 'scott.queue_queue_table' );
  dbms_aqadm.start_queue(queue_name => 'scott.sample_queue');
 
  dbms_aqadm.create_queue_table (
    Queue_table            => 'scott.topic_queue_table',
    Multiple_consumers => TRUE,
    Queue_payload_type     => 'scott.topic_message');
  dbms_aqadm.create_queue(
    queue_name  => 'scott.sample_topic',
    queue_table => 'scott.topic_queue_table' );
  dbms_aqadm.start_queue(queue_name => 'scott.sample_topic');
END;
/

WebServicesAssemblerで生成されるキューのWebサービスのサンプル

「サンプルのAQキュー/トピックの宣言」で記述されているキューに対してWebServicesAssemblerによって公開されるWebサービス操作を、例10-14にリストします。

この例では、send操作がペイロードをキューにエンキューしています。ペイロード・タイプは、<send/>要素に示されているように、複合型tns:QueueMessageUserです。この型はSQL型QUEUE_MESSAGEに対応しています。receive操作はキューからのペイロードを戻します。<receiveResponse/>要素は、戻されるペイロードのタイプがtns:QueueMessageであることを示しています。メッセージがキューに追加されるまで操作はブロックされます。receiveNoWait操作はキューからのペイロードを戻します。キューにメッセージが存在しない場合は、操作は待機せずにNULLを戻します。 receive2操作は2つの引数を持ちます。

selectorはAQ規則で指定されているフィルタ条件です。条件を満たすメッセージのみを戻すreceive操作が可能です。たとえば、JMSPriority < 3 AND PRICE < 300をselectorに指定すると、優先度3以上、および属性PRICEが300未満のメッセージのみが公開されます。パラメータnoWaittrueの場合、操作はブロックされません。

例10-14    キューに対して公開されるWebサービス操作

<operation name="receive">
  <input message="tns:SampleQueue_receive" /> 
  <output message="tns:SampleQueue_receiveResponse" /> 
  </operation>
<operation name="receive2">
  <input message="tns:SampleQueue_receive2" /> 
  <output message="tns:SampleQueue_receive2Response" /> 
  </operation>
<operation name="receiveNoWait">
  <input message="tns:SampleQueue_receiveNoWait" /> 
  <output message="tns:SampleQueue_receiveNoWaitResponse" /> 
  </operation>
<operation name="send">
  <input message="tns:SampleQueue_send" /> 
  <output message="tns:SampleQueue_sendResponse" /> 
  </operation>
 
<complexType name="receive">
  <sequence /> 
  </complexType>
<complexType name="receiveResponse">
<sequence>
  <element name="result" type="tns:QueueMessageUser" nillable="true" /> 
  </sequence>
  </complexType>
<complexType name="QueueMessageUser">
<sequence>
  <element name="text" type="string" nillable="true" /> 
  <element name="subject" type="string" nillable="true" /> 
  </sequence>
  </complexType>
<complexType name="receive2">
<sequence>
  <element name="String_1" type="string" nillable="true" /> 
  <element name="boolean_2" type="boolean" /> 
  </sequence>
  </complexType>
<complexType name="receive2Response">
<sequence>
  <element name="result" type="tns:QueueMessageUser" nillable="true" /> 
  </sequence>
  </complexType>
<complexType name="receiveNoWait">
  <sequence /> 
  </complexType>
<complexType name="receiveNoWaitResponse">
<sequence>
  <element name="result" type="tns:QueueMessageUser" nillable="true" /> 
  </sequence>
  </complexType>
<complexType name="send">
<sequence>
  <element name="QueueMessageUser_1" type="tns:QueueMessageUser" nillable="true" /> 
  </sequence>
  </complexType>
<complexType name="sendResponse">
  <sequence /> 
  </complexType>

WebServicesAssemblerで生成されるトピックに対するWebサービスのサンプル

「サンプルのAQキュー/トピックの宣言」で記述されているトピックに対してWebServicesAssemblerによって公開されるWebサービス操作を、例10-15にリストします。

この例では、publish操作によりペイロードがトピックに入力されます。引数は、例10-15で示しているように、tns:TopicMessageUserなどのペイロード・タイプです。このメッセージは、すべてのトピック・サブスクライバに受信されます。

publish2操作は、ペイロードを受信者リストのすべてのサブスクライバに送信します。この操作は次の引数を取ります。

publish3操作は、ペイロードをトピックにブロードキャストします。この操作は次の引数を取ります。

receive操作は、受信者に送信されるメッセージを戻します。この操作は1つの引数receiverを取ります。

receiveNoWait操作は、指定された受信者に待機なしで送信されるメッセージを戻します。

receive2操作は、指定された受信者に送信されるフィルタ処理済メッセージを戻します。この操作は次の引数を取ります。

receive3操作は、指定された受信者に対するフィルタ済のペイロードを戻します。この操作は次の引数を取ります。

subscribe操作は、ユーザーをトピックにサブスクライブします。Webサービスのサポート基盤となる接続には、コンシューマをサブスクライブするために必要な権限が付与されている必要があります。権限がない場合は、この操作は無効です。

unsubscribe操作は、ユーザーをトピックからサブスクライブ解除します。この場合も、Webサービスのサポート基盤となる接続には、コンシューマをサブスクライブ解除するために必要な権限が付与されている必要があります。権限がない場合は、この操作は無効です。

関連資料

コンシューマのサブスクライブおよびサブスクライブ解除に必要な権限の詳細は、『Oracle Streams Advanced Queuing Java API Reference』を参照してください。 

例10-15    トピックに対して公開されるWebサービス操作

<operation name="publish">
  <input message="tns:SampleTopic_publish" /> 
  <output message="tns:SampleTopic_publishResponse" /> 
  </operation>
<operation name="publish2">
  <input message="tns:SampleTopic_publish2" /> 
  <output message="tns:SampleTopic_publish2Response" /> 
  </operation>
<operation name="publish3">
  <input message="tns:SampleTopic_publish3" /> 
  <output message="tns:SampleTopic_publish3Response" /> 
  </operation>
<operation name="receive">
  <input message="tns:SampleTopic_receive" /> 
  <output message="tns:SampleTopic_receiveResponse" /> 
  </operation>
<operation name="receive2">
  <input message="tns:SampleTopic_receive2" /> 
  <output message="tns:SampleTopic_receive2Response" /> 
  </operation>
<operation name="receive3">
  <input message="tns:SampleTopic_receive3" /> 
  <output message="tns:SampleTopic_receive3Response" /> 
  </operation>
<operation name="receiveNoWait">
  <input message="tns:SampleTopic_receiveNoWait" /> 
  <output message="tns:SampleTopic_receiveNoWaitResponse" /> 
  </operation>
<complexType name="publish">
<sequence>
  <element name="TopicMessageUser_1" type="tns:TopicMessageUser" nillable="true" /> 
  </sequence>
  </complexType>
<complexType name="TopicMessageUser">
<sequence>
  <element name="text" type="string" nillable="true" /> 
  <element name="subject" type="string" nillable="true" /> 
  </sequence>
  </complexType>
<complexType name="publishResponse">
  <sequence /> 
  </complexType>
<complexType name="publish2">
<sequence>
  <element name="TopicMessageUser_1" type="tns:TopicMessageUser" nillable="true" /> 
  <element name="arrayOfString_2" type="string" nillable="true" minOccurs="0" 
maxOccurs="unbounded" /> 
  </sequence>
  </complexType>
<complexType name="publish2Response">
  <sequence /> 
  </complexType>
<complexType name="publish3">
<sequence>
  <element name="TopicMessageUser_1" type="tns:TopicMessageUser" nillable="true" /> 
  <element name="int_2" type="int" /> 
  <element name="int_3" type="int" /> 
  <element name="long_4" type="long" /> 
  </sequence>
  </complexType>
<complexType name="publish3Response">
  <sequence /> 
  </complexType>
<complexType name="receive">
<sequence>
  <element name="String_1" type="string" nillable="true" /> 
  </sequence>
  </complexType>
<complexType name="receiveResponse">
<sequence>
  <element name="result" type="tns:TopicMessageUser" nillable="true" /> 
  </sequence>
  </complexType>
<complexType name="receive2">
<sequence>
  <element name="String_1" type="string" nillable="true" /> 
  <element name="String_2" type="string" nillable="true" /> 
  </sequence>
  </complexType>
<complexType name="receive2Response">
<sequence>
  <element name="result" type="tns:TopicMessageUser" nillable="true" /> 
  </sequence>
  </complexType>
<complexType name="receive3">
<sequence>
  <element name="String_1" type="string" nillable="true" /> 
  <element name="String_2" type="string" nillable="true" /> 
  <element name="long_3" type="long" /> 
  </sequence>
  </complexType>
<complexType name="receive3Response">
<sequence>
  <element name="result" type="tns:TopicMessageUser" nillable="true" /> 
  </sequence>
  </complexType>
<complexType name="receiveNoWait">
<sequence>
  <element name="String_1" type="string" nillable="true" /> 
  </sequence>
  </complexType>
<complexType name="receiveNoWaitResponse">
<sequence>
  <element name="result" type="tns:TopicMessageUser" nillable="true" /> 
  </sequence>
  </complexType>

Webサービスとして公開されているAQキューにクライアント・コードからアクセスする方法

例10-16は、公開されているWebサービスにアクセスするJAX-RPC Webサービス・クライアントのサンプルです。「WebServicesAssemblerで生成されるトピックに対するWebサービスのサンプル」は、キューとトピックによって公開される操作を示しています。

例10-16    Webサービスとして公開されるAQキューにアクセスするクライアント・コード

SampleQueuePortClient queue = new SampleQueuePortClient();
     QueueMessageUser m;
     queue.send(new QueueMessageUser( "star chopper", "sample 1"));
     queue.send(new QueueMessageUser("easy blocks", "sample 2"));
     queue.send(new QueueMessageUser("back to future", "sample 3"));
     m = queue.receive();
     while (m != null) {
         System.out.println("Message received from SampleQueue: " + m.getSubject() + ": 
" + m.getText());
         m = queue.receiveNoWait();
          }

このクライアントは次のレスポンスを戻します。

      Message received from SampleQueue: sample 1: star chopper
      Message received from SampleQueue: sample 2: easy blocks
      Message received from SampleQueue: sample 3: back to future

JMSを使用したOracle AQ Queueにアクセスする方法

デフォルトでは、Webサービス・インタフェース・コードはデータソースを使用してJDBC接続を取得します。次に、この接続を使用してデータベース内のキューにアクセスします。

JDBCのかわりにJMSを使用してキューにアクセスすることもできます。WebServicesAssemblerツールには、aqAssembleコマンドに対して次のような特別な引数が用意されており、これらを使用してJMSキュー・インスタンスを使用することで、公開されるOracle AQにアクセスできます。

aqAssembleコマンドでdataSource引数を指定するかわりに、前述のパラメータのいずれかを指定できます。Webサービスの実行時に、JMSキューがJDBCベースのキューのかわりに使用されます。

サーバー・サイドJavaクラスをWebサービスとしてアセンブルする方法

dbJavaAssembleコマンドを使用して、Oracleデータベース内のJava VMのJavaクラスを起動するWebサービスを生成します。Webサービス操作として公開できるのは、静的メソッドまたはインスタンス・メソッドです。インスタンス・メソッドは、セッションのデフォルト・インスタンスまたはシングルトン・インスタンスを介して起動できます。

公開するJavaクラスには、次のパラメータ型および戻り型を指定できます。

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

前提条件

開始する前に、次の情報を用意してください。

サーバー・サイドJavaクラスからのWebサービスをアセンブルする手順

次の手順は、WebServicesAssemblerを使用してサーバー・サイドJavaクラスからWebサービスをアセンブルする方法を示しています。

  1. 「前提条件」の項で説明した情報を、WebServicesAssemblerのdbJavaAssembleコマンドに入力します。

    例を示します。次のdbJavaAssembleコマンドでは、サーバー・サイド・クラスoracle.sqlj.checker.JdbcVersionはSQLJサーバー・サイド・トランスレータに含まれています。このコマンドは、クラスjavacallin.earに対するWebサービス・アプリケーションをアセンブルします。また、PL/SQLラッパーおよびJavaストアド・プロシージャのラッパーも生成します。Javaストアド・プロシージャのラッパーの目的は、サーバー・サイドJavaクラスのシグネチャ型を、PL/SQLストアド・プロシージャに公開できる型に変換することです。sysUser引数が宣言されているため、WebServicesAssemblerにより、生成されたラッパーはデータベースに自動的にロードされます。

    コマンドライン:

    java -jar wsa.jar 
      -dbJavaAssemble 
      -appName javacallin
      -dbJavaClassName oracle.sqlj.checker.JdbcVersion
      -dbConnection jdbc:oracle:thin:@stacd15:1521:lsqlj 
      -dataSource jdbc/OracleManagedDS 
      -dbUser scott/tiger 
      -sysUser sys/knl_test7
    

    Antタスク:

    <oracle:dbJavaAssemble 
       appName="javacallin"
       dbJavaClassName="oracle.sqlj.checker.JdbcVersion"
       dbConnection="jdbc:oracle:thin:@stacd15:1521:lsqlj" 
       dataSource="jdbc/OracleManagedDS" 
       dbUser="scott/tiger" 
       sysUser="sys/knl_test7"
    />
    

    このコマンドおよびAntタスクの説明:

    • dbJavaAssemble: OracleデータベースにあるJava VMのJavaクラスからWebサービスを生成します。このコマンドを使用するには、データベースに接続する必要があります。「dbJavaAssemble」を参照してください。

    • appName: アプリケーションの名前を指定します。この名前は、通常contexturiなどの他の引数のベース値として使用されます。「appName」を参照してください。

    • dbJavaClassName: Webサービスとして公開するサーバー・サイドJavaクラスの名前を指定します。「dbJavaClassName」を参照してください。

    • dbConnection: データベースのJDBC URLを指定します。「dbConnection」を参照してください。

    • dataSource: 実行時にWebサービスによって使用されるデータソースのJNDI位置を指定します。「dataSource」を参照してください。

    • dbUser: user/passwordの形式でデータベースのスキーマとパスワードを指定します。「dbUser」を参照してください。

    • sysUser: SYS権限のあるユーザーの名前とパスワードを、dbSysUser/syspasswordの形式で指定します。この引数を使用すると、コード生成時にPL/SQLおよびJavaラッパー・コードがデータベースに自動的にインストールされます。「sysUser」を参照してください。

    実行時には、WebサービスのコードがJDBCを使用してPL/SQLラッパーを起動し、ここからJavaストアド・プロシージャ・ラッパーが起動され、さらに最終的に当該のサーバー・サイド・クラスが起動されます。例10-18に、このコマンドで生成されるWebサービス操作をいくつか示します。

  2. サービスをOC4Jの実行中インスタンスにデプロイし、アプリケーションをバインドします。

    このステップは、ステップ1に指定されているデータソースがOC4Jのインスタンスにインストールされていることを前提にしています。

    次のコマンドラインは、サンプルのデプロイおよびバインドのコマンドです。

    % java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome  
    -deploy -file dist/javacallin.ear -deploymentName javacallin
    
    % java -jar <J2EE_HOME>/admin_client.jar deployer:oc4j:localhost:port admin welcome  
    -bindWebApp javacallin javacallin-web default-web-site /javacallin
    

    この例において、<J2EE_HOME>は、J2EEのインストール・ディレクトリです。

    EARファイルのデプロイの詳細は、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。

  3. (オプション)デプロイが成功したことを確認します。

    OracleAS Web Servicesでは、デプロイされたWebサービスごとにWebサービス・テスト・ページが提供されます。Webサービス・テスト・ページへのアクセスおよびその使用方法の詳細は、「Webサービス・テスト・ページの使用方法」を参照してください。

  4. クライアント・サイド・コードを生成します。

    • J2SE環境の場合、genProxyコマンドを使用してWebServicesAssemblerツールを実行し、J2SE Webサービス・クライアントのスタブ(クライアント・プロキシ)を生成します。J2SE環境向けのクライアント・サイド・コードの生成およびアセンブルの詳細は、第15章「J2SE Webサービス・クライアントのアセンブル」を参照してください。

    • J2EE環境の場合、genInterfaceコマンドを使用してWebServicesAssemblerツールを実行し、J2EE Webサービス・クライアント用のJAX-RPCマッピング・ファイルおよびサービス・エンドポイント・インタフェースを生成します。クライアント・サイド・コードの生成およびアセンブルの詳細は、第14章「J2EE Webサービス・クライアントのアセンブル」を参照してください。

    たとえば、次のコマンドはgenProxyを使用してJ2SEクライアントのコードを生成します。

    % java -jar wsa.jar -genProxy 
                        -wsdl http://locahost:8888/javacallin/javacallin?WSDL 
                        -output build/src/client 
                        -mappingFileName ./mapping.xml 
                        -packageName oracle.demo.db.queue.stub 
                        -unwrapParameters true
    

    このコマンドの説明:

    • genProxy: J2SE Webサービス・クライアントから使用可能な静的プロキシ・スタブを作成します。「genProxy」を参照してください。

    • wsdl: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。「wsdl」を参照してください。

    • output: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。

    • mappingFileName: JAX-RPCマッピング・ファイルを指すファイル位置を指定します。「mappingFileName」を参照してください。

    • packageName: JAX-RPCマッピング・ファイルにパッケージ名が宣言されていない場合に、生成されたクラス用に使用されるパッケージ名を指定します。「packageName」を参照してください。

    • unwrapParameters: この引数はdocument-literal操作に対してのみ設定でき、その他のメッセージ書式では無視されます。unwrapParameterstrueに設定すると(デフォルト)、戻り型とレスポンス・タイプがアンラップされます。通常はこの方が使いやすくなります。特にタイプが単純な場合はそうです。「unwrapParameters」を参照してください。

  5. クライアントをコンパイルおよび実行します。

    クライアントをコンパイルする前に、クラスパス上にある適切なJARをリストします。クライアントのクラスパスで使用可能なすべてのJARファイルのリストについては、表A-2「クライアント・サイド・プロキシを使用するクライアントのクラスパス・コンポーネント」を参照してください。個々のJARをリストするかわりに、クライアントのクラスパスにクライアント側のJARとしてwsclient_extended.jarを含めることができます。このJARファイルには、Webサービス・クライアントをコンパイルおよび実行するために必要なすべてのクラスが含まれます。これらのクラスは、表A-2にリストされている各JARファイルに含まれているものです。wsclient_extended.jarおよびクライアントのクラスパスの詳細は、「Webサービス・プロキシのクラスパスの設定」を参照してください。

    次のコマンドラインは、サンプルのコンパイルおよび実行のコマンドです。

    % javac -classpath path
    <ORACLE_HOME>/webservices/lib/wsclient_extended.jar: 
    :<ORACLE_HOME>/webservices/lib/jaxrpc-api.jar JavacallinClient.java
     
    % java -classpath path
    <ORACLE_HOME>/webservices/lib/wsclient_extended.jar:
    <ORACLE_HOME>/webservices/lib/jaxrpc-api.jar:
    <J2EE_HOME>/lib/jax-qname-namespace.jar:
    <J2EE_HOME>/lib/activation.jar:<J2EE_HOME>/lib/mail.jar:
    <J2EE_HOME>/lib/http_client.jar:
    <ORACLE_HOME>/webservices/lib/commons-logging.jar:
    <ORACLE_HOME>/lib/xmlparserv2.jar JavacallinClient
    

    この例において、<J2EE_HOME>はJ2EEのインストール・ディレクトリであり、<ORACLE_HOME>はOC4Jのインストール・ディレクトリです。

サンプルのサーバー・サイドJavaクラス

例10-17には、Oracle9iおよび10gデータベースとともに配布されているサーバー・サイドJavaクラスoracle.sqlj.checker.JdbcVersionの2つのAPIが示されています。dbJavaAssembleコマンドはこれらのAPIをWebサービスとして公開します。

例10-17    サンプルのサーバー・サイドJavaクラス

public class oracle.sqlj.checker.JdbcVersion extends java.lang.Object {
    public static int getDriverMajorVersion();
    public static int getDriverMinorVersion();
    ...
}

サーバー・サイドJavaクラスから生成されるWebサービス操作のサンプル

例10-18のWSDLフラグメントは、例10-17JdbcVersion APIのgetDriverMajorVersionおよびgetDriverMinorVersionに対して生成されたWebサービス操作です。

例10-18    サーバー・サイドJavaクラスに対して生成される操作を示すWSDLフラグメント

<complexType name="getDriverMajorVersion">
  <sequence /> 
  </complexType>
<complexType name="getDriverMajorVersionResponse">
<sequence>
  <element name="result" type="decimal" nillable="true" /> 
  </sequence>
  </complexType>
<complexType name="getDriverMinorVersion">
  <sequence /> 
  </complexType>
<complexType name="getDriverMinorVersionResponse">
<sequence>
  <element name="result" type="decimal" nillable="true" /> 
  </sequence>
  </complexType>
 
<portType name="JdbcVersion">
<operation name="getDriverMajorVersion">
  <input message="tns:JdbcVersion_getDriverMajorVersion" /> 
  <output message="tns:JdbcVersion_getDriverMajorVersionResponse" /> 
  </operation>
<operation name="getDriverMinorVersion">
  <input message="tns:JdbcVersion_getDriverMinorVersion" /> 
  <output message="tns:JdbcVersion_getDriverMinorVersionResponse" /> 
  </operation>
  </portType>


注意

サーバー・サイドJavaクラスは、Webサービスから起動せずに、JDBCから起動することもできます。JDBCから起動する場合、『Oracle Database JPublisherユーザーズ・ガイド』で、データベース・サーバー・サイドJavaを起動するプロキシ・クラスの生成方法を参照してください。 


データベースにおけるWebサービス・クライアントの開発

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

Webサービスのコールアウトの概要

Oracle JPublisherは、PL/SQLおよびJava Webサービスのコールアウトを、必要なスタブ・コードの作成によってサポートしています。これにより、データベース内でPL/SQLまたはJavaを使用してWebサービス・クライアントを起動できるようになります。Webサービスのコールアウト用に、WSDLのファイルすなわち位置をOracle JPublisherに指定します。Oracle JPublisherにより、PL/SQLラッパー、およびPL/SQLラッパーを実装する必要なデータベース・サーバー・サイドJavaクラスが生成されます。生成されるPL/SQLラッパーには、各Webサービス操作用のPL/SQLプロシージャまたはファンクションが格納されます。

オプションとして、Oracle JPublisherには、Javaクライアント・プロキシのみを生成する機能もあります。これらのJavaクライアント・プロキシは、データベースのJavaコードによるWebサービスのコールアウトに使用できます。

図10-3に、Oracle JPublisherが生成可能なスタブ・コードを示します。

図10-3    Webサービスのコールアウト・スタブの作成


画像の説明


注意

実行時にのみ使用可能なWSDLをベースにした外部Webサービスの起動を動的に構成する必要がある場合は、JAX-RPC Dynamic Invocation Interface API for JavaまたはPL/SQL UTL_DBWSパッケージを使用します。 


Oracle JPublisherが生成するクライアント・プロキシは、OracleAS Web Services 10.1.3のJavaプロキシに対して生成される、単純化されたクライアント・コードをベースにしています。したがって、Oracle JPublisherが生成するJavaおよびPL/SQLクライアントはOracleAS Web Services 10.1.3.1によって完全にサポートされます。さらに、Oracle JPublisherは、OracleAS Web Services 9.0.4スタイルのWebサービス・クライアントも生成できます。

Webサービスのコールアウトには、これらのユーティリティおよびツールが必要です。

Oracle JPublisherのこれらのオプションは、Webサービスのコールアウトには必須です。

これらはOracle JPublisherのオプション・パラメータです。

sysUser引数を使用することで、Oracle JPublisherが生成済ファイルをデータベースにロードできるようになります。この引数が宣言されていない場合は、PL/SQLからWebサービスを起動するために、生成済ファイルを手動でデータベースにロードする必要があります。

関連資料

Webサービスのコールアウトに関連したオプション(proxywsdlproxyoptsおよびhttpproxyなど)や例については、『Oracle Database JPublisherユーザーズ・ガイド』を参照してください。 

データベースからWebサービスをコールする方法

Webサービス・コールアウト・ユーティリティを使用すると、クライアントはデータベースからWebサービスにアクセスできます。Webサービス・コールアウトは、データベース内のPL/SQLクライアント、SQL文およびJavaで使用できます。このユーティリティは、Oracle JPublisher 10gリリース2(10.2)およびOracleAS Web Services 10gリリース3(10.1.3.1)が基になっています。

ターゲットがOracle Database 10g(リリース10.1または10.2)か、Oracle Database 10gより前かによって、2つのバージョンのユーティリティを使用できます。

コールアウト・ユーティリティは、次のWebサイトの「Database as Web Services consumer: Calling-out external Web services」から入手できます。

http://www.oracle.com/technology/sample_code/tech/java/jsp/dbwebservices.html

次の各項では、データベース内のクライアントがWebサービス・コールアウトを実行する方法について説明します。

静的プロキシおよびJPublisherを使用してWebサービス・コールアウトを実行する方法

Oracle JPublisherのコマンドライン・オプション-proxywsdlを使用すると、WebサービスのWSDLファイルからデータベース・サイドのJavaラッパーおよびPL/SQLラッパーを生成できます。JPublisherがWebサービス・クライアント用のラッパーを生成してデータベースにロードするには、dbwsa.jarファイルとdbwsclient.jarファイルが、それぞれ、クラスパス内およびデータベース内部に存在している必要があります。

次の手順に従って、Oracle JPublisherがサポートするWebサービス・コールアウト用の環境とデータベースを設定します。この手順は、1回のみ実行する必要があります。

  1. まだシステムにない場合は、Oracle JPublisher 10gリリース2(10.2)をダウンロードしてインストールします。

    Oracle JPublisherのリリースは、次のWebサイトから入手できます。

    http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

  2. dbwsa.jarを、ディレクトリORACLE_HOME¥sqlj¥lib(Windowsの場合)またはORACLE_HOME/sqlj/lib(Solarisの場合)に追加します。

  3. Java VMおよびJavaコンパイラとして適切なJDKを設定します。

    JDKのバージョンは、ターゲット・データベースのJava VMと同じである必要があります。

    • Oracle Database 10g(リリース10.1または10.2)の場合は、JDK 1.4を使用します。

    • Oracle Database 9.2の場合は、JDK 1.3を使用します。

  4. dbwsa.jarファイルを、クラスパス環境変数に追加します。

  5. SYSスキーマ、またはWebサービス・クライアントが起動されたスキーマに、dbwsclient.jarファイルをロードします。

    たとえば、次のloadjavaコマンドは、dbwsclient.jarファイルをSYSスキーマにロードします。

    %loadjava -u sys/change_on_install -r -v -f -s -grant public -noverify -genmissing 
    dbwsclient.jar
    

    次のloadjavaコマンドは、dbwsclient.jarファイルを特定のスキーマにロードする方法を示しています。

    % loadjava -u scott/tiger -r -v -f -noverify -genmissing dbwsclient.jar
    

次の例は、Webサービス・クライアント用のJavaラッパーおよびPL/SQLラッパーを生成し、SQL文を使用してそれを起動する方法を示しています。この例では、次の一般的な手順に従います。

  1. 起動するWebサービスを識別します。

  2. 適切なオプションを指定してOracle JPublisherをコールし、クライアント・プロキシ、PL/SQLラッパーおよびJavaラッパーを生成して、データベースにそれらをロードします。

    これを行うためのOracle JPublisherコマンドは、必須の-proxywsdlオプションと-userオプションを含みます。また、オプションの-endpoint-httpproxy-sysuser-dirおよび-proxyoptsの各オプションを含む場合もあります。次に例を示します。

    % jpub -user=username/password -sysuser=superuser_name/superuser_password 
    -proxywsdl=WSDL_URL -endpoint=Web_services_endpoint  
    

    Webサービスがすでにhttp://localhost:8888/javacallout/javacalloutにデプロイされているものとします。

    次のコマンドは、Webサービス・クライアントおよびそのJavaラッパーとPL/SQLラッパーをサブディレクトリtmpに作成した後、データベースにラッパーをロードします。

    % jpub -user scott/tiger -sysuser sys/change_on_install 
    -proxywsdl=sample/javacallout.wsdl   
    -endpoint=http://localhost:8888/javacallout/javacallout -dir=tmp
    

    このコマンドは次の出力を生成します。

    tmp/HelloServiceEJBJPub.java
    tmp/plsql_wrapper.sql
    tmp/plsql_dropper.sql
    tmp/plsql_grant.sql
    tmp/plsql_revoke.sql
    Executing tmp/plsql_dropper.sql
    Executing tmp/plsql_wrapper.sql
    Executing tmp/plsql_grant.sql
    Loading tmp/plsql_proxy.jar
    
  3. データベースの内部からWebサービスを起動します。

    tmp/plsql_wrapper.sqlで提供されているPL/SQLファンクションを起動できます。各PL/SQLファンクションは、Webサービスの操作に対応しています。たとえば、次のエンドポイントでWebサービスを利用できるものとします。

    http://localhost:8888/javacallout/javacallout
    

    この場合は、次のSQLコマンドを発行できます。

    SQL> select jpub_plsql_wrapper.sayhello('hello') from dual;
    

    コマンドは次の出力を戻します。

    JPUB_PLSQL_WRAPPER.SAYHELLO('HELLO')
    -----------------------------------
    HELLO!! You just said :hello
    

Oracle JPublisherのコールアウト・サポートの詳細は、『Oracle Database JPublisherユーザーズ・ガイド』のDynamic Invocation InterfaceとSYS.UTL_DBWSユーティリティを使用したWebサービス・コールアウトに関する項を参照してください。この資料は、次のWebサイトから入手できます。

http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

DIIおよびSYS.UTL_DBWSユーティリティを使用してWebサービス・コールアウトを実行する方法

PL/SQLユーザーは、PL/SQLのパッケージSYS.UTL_DBWSを使用してWebサービスを起動できます。このパッケージでは、JAX-RPC Dynamic Invocation Interface(DII)API用のラッパー・ファンクションが提供されています。

次の手順は、Oracle Database 10gリリース1以降に適用されます。この手順では、SYS.UTL_DBWSを使用するWebサービス・コールアウト用にデータベースを設定し、ダウンロードで提供される最新の機能でユーティリティを更新します。

  1. 「静的プロキシおよびJPublisherを使用してWebサービス・コールアウトを実行する方法」の説明に従って、dbwsclient.jarファイルをデータベースにロードします。

  2. SYSとしてSQLスクリプトutl_dbws_decl.sqlおよびutl_dbws_body.sqlを実行します。

    SYS.UTL_DBWSを使用してWebサービスをコールできるようになります。

コールアウト・ユーティリティのダウンロードには、SQLスクリプトsamples/test-plsql-dii.sqlおよびsamples/test-plsql-dii2.sqlが含まれます。どちらのスクリプトも、javacallout.wsdlで定義されているsayHello操作を起動します。2つのスクリプトでWSDLファイルとの通信を調べてください。どちらのスクリプトも、次の出力を生成します。PL/SQL DII client returnという文章は、クライアント・コードによって生成されます。

PL/SQL DII client return HELLO!! You just said :hello  

SYS.UTL_DBWSユーティリティの詳細は、次のWebサイトから入手できる『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

http://www.oracle.com/technology/documentation/database10g.html

データベース・リソースを公開するWebサービスに対するツールのサポート

Oracle JDeveloperを使用すると、Oracleデータベースに保存されているPL/SQLパッケージのプログラム・ユニットをベースにして、Webサービスを作成できます。Oracle JDeveloperの各ウィザードを使用すると、次のタスクを実行できます。

Oracle JDeveloperを使用してPL/SQLパッケージ・ユニットを作成し、Webサービスとして公開する方法の詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。

制限事項

「データベース・リソースからのWebサービスの開発」を参照してください。

追加情報

詳細は、次を参照してください。


戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引