ヘッダーをスキップ

Oracle Database Application Expressユーザーズ・ガイド リリース 3.0 E05267-02 |
| 目次 | 索引

前へ | 次へ |

# 13 高度なプログラミング手法

このセクションでは、自動的なデータ操作言語を使用した作業、データベース・リンクの確立、コレクションの使用、バックグラウンドSQLの実行、Webサービスの使用、ユーザー・プリファレンスの管理など、高度なプログラミング手法について説明します。

このセクションの内容は次のとおりです。

- DMLロックの概要

- データベース・リンクを使用したデータへのアクセス

- アプリケーションからの電子メール送信

- コレクションの使用

- APEX_ACTIVITY_LOGを使用したカスタム・アクティビティ・レポートの作成

- バックグラウンドPL/SQLの実行

- Webサービスの実装

参照: 「Oracle Application Express API」および「アプリケーションのデプロイ」

## DMLロックの概要

自動的なデータ操作言語（DML）が表内の行を更新または削除するためにOracle Application Expressで使用される場合、トランザクションが開始されるとまず行をロックし、ページに表示されてから変更されたかどうかを確認して、最後に行に対する`UPDATE`または`DELETE`文を発行します。

行のロックが頻繁に発生する一部の環境では、DML操作を制御してDML操作が次の状態かどうかを判別する場合があります。

- 無期限に待機

- 即時に失敗

- 指定した一定時間待機

アプリケーション置換文字列、アプリケーション・アイテムまたは`APEX_DML_LOCK_WAIT_TIME`というページ・アイテムの値を設定すると、このオプションを制御できます。次の値がサポートされています。

- NULLの場合（デフォルト）、Oracle Application Expressの以前のバージョンと同じ動作、つまり、無期限に待機します。

- 0の場合、他のデータベース・セッションによって行がロックされていると、即時に失敗します。

- 0以上で行がロックされている場合、指定した秒数間待機します。

アプリケーションで設定する場合、`APEX_DML_LOCK_WAIT_TIME`の値はアプリケーション全体の自動DMLを使用するすべての`UPDATE`および`DELETE` DML操作に適用されます。特定の自動DMLプロセスを制御するには、自動DMLプロセスの前に`APEX_DML_LOCK_WAIT_TIME`の値を更新して、自動DMLプロセスの後にリセットします。これは、表形式フォームを使用した更新および削除には影響しないことに注意してください。

## データベース・リンクを使用したデータへのアクセス

作業領域のホームページはOracle Database上で実行されるため、ユーザーは、Oracleのすべての分散データベース機能を使用できます。通常、分散データベース操作は、データベース・リンクを使用して実行します。

データベース・リンクは1つのデータベースのスキーマ・オブジェクトであり、これを使用すると、別のデータベース上のオブジェクトにアクセスできます。データベース・リンクを作成すると、表名またはビュー名に`@dblink`を追加することによって、リモート・オブジェクトにアクセスできます。この場合の`dblink`は、データベース・オブジェクトの作成ウィザードで指定するデータベース・リンク名です。

注意: デフォルトでは、CREATE DATABASE LINKシステム権限は、割り当てられた作業領域またはデータベース・ユーザーに付与されません。この機能を使用するには、DBAまたは管理者が、この特定の権限をユーザーの作業領域のデータベース・ユーザーに付与する必要があります。『Oracle Database管理者ガイド』の「データベース・リンクの作成」を参照してください。

データベース・リンクを作成するには、次のステップを実行します。

1. 作業領域ホームページで、「SQLワークショップ」をクリックして、「オブジェクト・ブラウザ」をクリックします。

   オブジェクト・ブラウザが表示されます。

2. 「作成」をクリックします。

3. 「データベース・リンク」を選択して、「次へ」をクリックします。

4. 画面に表示されるステップに従います。

   データベース・リンク名は、Oracleのネーミング規則に従う必要があり、空白を含めたり、数字やアンダースコアから開始することはできません。

既存のデータベース・リンクを表示するには、次のステップを実行します。

1. 作業領域ホームページで、「SQLワークショップ」をクリックして、「オブジェクト・ブラウザ」をクリックします。

   オブジェクト・ブラウザが表示されます。

2. ページ上部のオブジェクト・タイプ「データベース・リンク」を選択します。

参照: 「オブジェクト・ブラウザを使用したデータベース・オブジェクトの管理」および『Oracle Database管理者ガイド』の「データベース・リンク」

## アプリケーションからの電子メール送信

このセクションでは、Oracle Application Expressアプリケーションから電子メールを送信する方法を説明します。

このセクションの構成は次のとおりです。

- 電子メールを送信するためのOracle Application Expressの構成の概要

- アプリケーションからの電子メール送信

参照: 「メールの管理」

ヒント: Oracle Database 11g リリース1（11.1）でOracle Application Expressを実行している場合は、外部に電子メールを送信するにはネットワーク・サービスを有効化する必要があります。「Oracle Database 11gのネットワーク・サービスの有効化」を参照してください。

### 電子メールを送信するためのOracle Application Expressの構成の概要

アプリケーション・ビルダー・アプリケーションから電子メールを送信する前に、次のステップを実行する必要があります。

1. Oracle Application Express管理サービスにログインし、インスタンスの設定ページで電子メール設定を構成します。「電子メール設定の構成」を参照してください。

2. さらに、Oracle Database 11g リリース1（11.1）でOracle Application Expressを実行している場合、外部へのメールを有効化する必要があります。Oracle Database 11g リリース1（11.1）では、ネットワーク・サービスと通信する機能はデフォルトで無効になっています。「Oracle Database 11gのネットワーク・サービスの有効化」を参照してください。

ヒント: 新しい作業領域リクエストが承認されたときにユーザーにログイン資格証明が電子メールで自動的に送信されるように、Oracle Application Expressを構成できます。詳細は、「割当てモードの指定」を参照してください。

### アプリケーションからの電子メールの送信

`APEX_MAIL`というPL/SQLパッケージをコールすることによって、アプリケーション・ビルダー・アプリケーションから電子メールを送信できます。このパッケージは、Oracleで提供される`UTL_SMTP`パッケージをベースとして構築されています。このような依存性があるため、`APEX_MAIL`を使用するには、`UTL_SMTP`パッケージがインストール済で機能している必要があります。

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

`APEX_MAIL`には、電子メールを手動で送信するための次の2つのプロシージャが含まれています。

- アプリケーションから外部へ電子メール・メッセージを手動で送信するには、`APEX_MAIL.SEND`プロシージャを使用します。

- `APEX_MAIL_QUEUE`に格納されたメール・メッセージを配信するには、 `APEX_MAIL.PUSH_QUEUE`を使用します。

Oracle Application Expressでは、表の指定した`APEX_MAIL_QUEUE`に、未送信の電子メール・メッセージが格納されます。`APEX_MAIL.PUSH_QUEUE`プロシージャをコールすると、このキューに格納されたメール・メッセージを指定したSMTPゲートウェイに配信できます。

Oracle Application Expressによって、正常に送信されたメッセージのログが、サーバーのローカル時間でのタイムスタンプとともに`APEX_MAIL_LOG`表に作成されます。

次に、シェル・スクリプトを使用した`APEX_MAIL.PUSH_QUEUE`プロシージャのUNIXまたはLinux使用例を示します。

    SQLPLUS / <<EOF
    APEX_MAIL.PUSH_QUEUE;
    DISCONNECT
    EXIT
    EOF

参照: `APEX_MAIL`の使用の詳細は、「APEX_MAIL」を参照。また、その他の詳細は、「メールの管理」を参照。

## コレクションの使用

コレクションを使用すると、1つ以上の非スカラー値を一時的に取得できます。コレクションを使用して、現在セッション・ステートにある行および列を格納します。これによって、あるユーザーの特定のセッション中にそれらの行および列に対してアクセス、操作または処理を行うことができます。コレクションは、バケツのようなものと考えることができます。その中に情報の行を一時的に格納し、その情報を指定できます。

次に、コレクションを使用する場合の例を示します。

- データ入力ウィザードを作成しており、そのウィザードで、まず論理トランザクション中に複数行の情報を収集する必要がある場合。物理トランザクションと論理トランザクションの両方の完了時、ウィザードの最終ステップを実行する前に、コレクションを使用して、複数行の情報のコンテンツを一時的に格納できます。

- アプリケーションに、ユーザーが1つのページで複数の詳細行を更新する更新ページが含まれている場合。ユーザーは、複数の更新を行い、それらの更新をコレクションに適用した後、最終プロセスをコールしてそれらの変更をデータベースに適用できます。

- 任意の数の属性を収集するウィザードを構築している場合。コレクションに一時的に格納された情報が取得され、データベースに適用されるタスクをウィザードの最後にユーザーが実行するようにします。

このセクションの構成は次のとおりです。

- APEX_COLLECTION APIについて

- コレクションの作成

- コレクションの切捨て

- コレクションへのアクセス

- コレクションの削除

- コレクションへのメンバーの追加

- コレクション・メンバーの更新

- コレクション・メンバーの削除

- コレクション・ステータスの判別

- コレクションのマージ

- コレクションの管理

- コレクションのセッション・ステートのクリア

### APEX_COLLECTION APIについて

各コレクションには、データ要素（メンバー）の名前付きリストが含まれます。このリストには、最大50個の文字属性（`VARCHAR2(4000)`）および1個の大文字属性（`CLOB`）を含めることができます。PL/SQL API `APEX_COLLECTION`を使用して、コレクション情報を挿入、更新および削除します。

#### コレクションの名前の指定

新しいコレクションを作成する場合、255文字以下の名前を付ける必要があります。コレクション名の大/小文字は区別されず、すべて大文字に変換されます。

コレクションに名前を付けた後、コレクション内の値にアクセスするには、`APEX_COLLECTIONS`ビューに対してSQL問合せを実行します。

参照: 「コレクションへのアクセス」

### コレクションの作成

各コレクションには、データ要素（メンバー）の名前付きリストが含まれます。このリストには、最大50個の文字属性（`VARCHAR2(4000)`）および1個の大文字属性（`CLOB`）を含めることができます。次のメソッドを使用してコレクションを作成します。

- `CREATE_COLLECTION`

- `CREATE_OR_TRUNCATE_COLLECTION`

- `CREATE_COLLECTION_FROM_QUERY`

- `APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY_B`

`CREATE_COLLECTION`メソッドでは、指定したコレクションがすでに存在する場合は例外が発生します。次に例を示します。

    APEX_COLLECTION.CREATE_COLLECTION(
        p_collection_name => collection name );

`CREATE_OR_TRUNCATE_COLLECTION`メソッドでは、指定したコレクションが存在しない場合に、新しいコレクションが作成されます。指定したコレクションが存在する場合は、そのコレクションが切り捨てられます。切り捨てられたコレクションは空になりますが、コレクション自体はそのまま残ります。次に例を示します。

    APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION(
        p_collection_name => collection name,
        p_generate_md5    => YES or NO );

`CREATE_COLLECTION_FROM_QUERY`メソッドでは、コレクションが作成され、指定した問合せの結果がそのコレクションに移入されます。次に例を示します。

    APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY(
        p_collection_name => collection name,
        p_query           => your query );
        p_generate_md5    => YES or NO );

また、`CREATE_COLLECTION_FROM_QUERY_B`メソッドでは、コレクションが作成され、指定した問合せの結果がそのコレクションに移入されます。次に例を示します。

    APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY_B(
        p_collection_name => collection name,
        p_query           => your query );

`CREATE_COLLECTION_FROM_QUERY_B`メソッドでは、バルクSQL操作を実行することにより、`CREATE_COLLECTION_FROM_QUERY`メソッドよりも非常に速いパフォーマンスが提供されますが、次の制限があります。

- 問合せの選択リスト内の列値は、2,000バイトを超えることはできません。列値が2,000バイトを超える行がある場合は、実行中にエラーが発生します。

- コレクション内のいずれのメンバーに対してもMD5チェックサムは計算されません。

#### パラメータp_generate_md5

`p_generate_md5`フラグを使用して、コレクション・メンバーのデータのメッセージ・ダイジェストを計算する必要があるかどうかを指定します。デフォルトでは、このフラグは`NO`に設定されています。このパラメータを使用して、コレクション・メンバーのMD5をチェックします（つまり、MD5を他のメンバーと比較して、メンバーが変更されたかどうかを確認します）。

参照: `GET_MEMBER_MD5`ファンクションの使用方法については、「コレクション・ステータスの判別」を参照してください。

### コレクションの切捨て

コレクションを切り捨てる場合、指定したコレクションからすべてのメンバーを削除しますが、指定したコレクションはそのまま残ります。次に例を示します。

    APEX_COLLECTION.TRUNCATE_COLLECTION(
        p_collection_name => collection name );

### コレクションへのアクセス

データベース・ビュー`APEX_COLLECTIONS`を問い合せると、コレクションのメンバーにアクセスできます。`APEX_COLLECTIONS`ビューには、次の定義が含まれます。

    COLLECTION_NAME   NOT NULL VARCHAR2(255)
    SEQ_ID            NOT NULL NUMBER
    C001                       VARCHAR2(4000)
    C002                       VARCHAR2(4000)
    C003                       VARCHAR2(4000)
    C004                       VARCHAR2(4000)
    C005                       VARCHAR2(4000)
    ...
    C050                       VARCHAR2(4000)
    CLOB001                    CLOB
    MD5_ORIGINAL               VARCHAR2(4000)

`APEX_COLLECTIONS`ビューは、アプリケーションで、アプリケーション内の他の表またはビューと同様に使用します。次に例を示します。

    SELECT c001, c002, c003
       FROM APEX_collections
     WHERE collection_name = 'FIREARMS'

### コレクションの削除

コレクションを削除する場合は、コレクションおよびそのすべてのメンバーを削除します。次に例を示します。

    APEX_COLLECTION.DELETE_COLLECTION (
        p_collection_name => collection name );

コレクションを削除しない場合は、セッションがパージされると最終的にコレクションが削除されることに注意してください。次に例を示します。

#### 現在のアプリケーションに関するすべてのコレクションの削除

現在のアプリケーションに定義されたすべてのコレクションを削除するには、`DELETE_ALL_COLLECTIONS`メソッドを使用します。次に例を示します。

    APEX_COLLECTION.DELETE_ALL_COLLECTIONS;

#### 現在のセッションにおけるすべてのコレクションの削除

現在のセッションに定義されたすべてのコレクションを削除するには、`DELETE_ALL_COLLECTIONS_SESSION`メソッドを使用します。次に例を示します。

    APEX_COLLECTION.DELETE_ALL_COLLECTIONS_SESSION;

### コレクションへのメンバーの追加

コレクションに追加したデータ要素（メンバー）には、一意の順序番号が割り当てられます。メンバーをコレクションに追加すると、最も新しいメンバーが一番大きい番号を持つように、前のメンバーより1大きい番号が新しいメンバーに割り当てられます。

コレクションに新しいメンバーを追加するには、`ADD_MEMBERファンクション`を使用します。このファンクションをコールすると、新しく追加したメンバーの順序番号が戻されます。次の例では、`ADD_MEMBER`ファンクションを使用する方法を示します。

    APEX_COLLECTION.ADD_MEMBER(
        p_collection_name => collection name,
        p_c001          => [member attribute 1],
        p_c002          => [member attribute 2],
        p_c003          => [member attribute 3],
        p_c004          => [member attribute 4],
        p_c005          => [member attribute 5],
        p_c006          => [member attribute 6],
        p_c007          => [member attribute 7],
      ...
        p_c050          => [member attribute 50]);
        p_clob001       => [CLOB member attribute 1],
        p_generate_md5  => YES or NO);

`ADD_MEMBERS`メソッドを使用して、新しいメンバー（メンバーの配列）をコレクションに追加することもできます。次に例を示します。

    APEX_COLLECTION.ADD_MEMBERS(
        p_collection_name => collection name,
        p_c001          => member attribute array 1,
        p_c002          => member attribute array 2,
        p_c003          => member attribute array 3,
        p_c004          => member attribute array 4,
        p_c005          => member attribute array 5,
        p_c006          => member attribute array 6,
        p_c007          => member attribute array 7,
        ...
        p_c050          => member attribute array 50);
        p_generate_md5  => YES or NO);

指定したコレクションが、現在のユーザーの指定した名前で同じセッションに存在しない場合、このメソッドによりエラーが発生します。また、4,000文字を超える属性はすべて4,000文字に切り捨てられます。追加されるメンバー数は、1番目の配列の要素数に基づきます。

#### パラメータp_generate_md5およびp_clob001

`p_generate_md5`フラグを使用して、コレクション・メンバーのデータのメッセージ・ダイジェストを計算する必要があるかどうかを指定します。デフォルトでは、このフラグは`NO`に設定されています。このパラメータを使用して、コレクション・メンバーのMD5をチェックします（つまり、MD5を他のメンバーと比較して、メンバーが変更されたかどうかを確認します）。

4,000文字を超えるコレクション・メンバー属性には、`p_clob001`を使用します。

参照: ファンクション`GET_MEMBER_MD5`の使用方法については、「コレクション・ステータスの判別」を参照してください。

### コレクション・メンバーの更新

コレクション・メンバーを更新するには、`UPDATE_MEMBER`プロシージャをコールして、更新するコレクション・メンバーを順序番号を使用して参照します。次に例を示します。

    APEX_COLLECTION.UPDATE_MEMBER (
        p_collection_name => collection name,
        p_seq             => member sequence number,
        p_c001            => member attribute 1,
        p_c002            => member attribute 2,
        p_c003            => member attribute 3,
        p_c004            => member attribute 4,
        p_c005            => member attribute 5,
        p_c006            => member attribute 6,
        p_c007            => member attribute 7,
        ...
        p_c050            => member attribute 50);
        p_clob001         => [CLOB member attribute 1],

`UPDATE_MEMBER`プロシージャを使用すると、個々のメンバー属性ではなく、コレクション・メンバー全体を置き換えます。指定したコレクションが存在しない場合、このプロシージャによりエラーが発生します。次に例を示します。

4,000文字を超えるコレクション・メンバー属性には、`p_clob001`パラメータを使用します。

コレクション・メンバーの単一の属性を更新する場合には、`UPDATE_MEMBER_ATTRIBUTEプロシージャ`を使用します。次に例を示します。

    APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE(
        p_collection_name       => collection_name,
        p_seq                   => member sequence number,
        p_attr_number           => member attribute number,
        p_attr_value            => member attribute value )

    APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE(
        p_collection_name        => collection_name,
        p_seq                    => member sequence number,
        p_clob_number            => CLOB member attribute number,
        p_clob_value             => CLOB member attribute value );

指定したコレクションが存在しない場合、`UPDATE_MEMBER_ATTRIBUTE`プロシージャをコールすると、エラーが発生します。

`p_clob_number`パラメータの有効値は1のみであることに注意してください。

### コレクション・メンバーの削除

コレクション・メンバーを削除するには、`DELETE_MEMBER`プロシージャをコールして、削除するコレクション・メンバーを順序番号を使用して参照します。次に例を示します。

    APEX_COLLECTION.DELETE_MEMBER(
        p_collection_name => collection name,
        p_seq             => member sequence number);

このプロシージャを使用すると、指定したコレクション内の順序番号が欠落することに注意してください。また、指定したコレクションが存在しない場合、このプロシージャをコールするとエラーが発生します。

属性が特定の値に一致するまで、コレクションからすべてのメンバーを削除することもできます。次に例を示します。

    APEX_COLLECTION.DELETE_MEMBERS(
        p_collection_name => collection name,
        p_attr_number     => number of attribute used to match for the specified
                             attribute value for deletion,
        p_attr_value      => attribute value of the member attribute used to
                             match for deletion);

また、`DELETE_MEMBER`プロシージャを使用すると、指定したコレクション内の順序番号が欠落することに注意してください。次の場合に、このプロシージャによりエラーが発生します。

- 指定したコレクションが存在しない場合。

- 指定した属性番号が1から50の範囲外であるか、無効である場合。

指定した属性値がNULLの場合、指定したコレクションのすべてのメンバーが削除されます。

### コレクション・ステータスの判別

`p_generate_md5`パラメータは、コレクションの各メンバーに対してMD5メッセージ・ダイジェストを計算するかどうかを判別します。コレクションの作成直後、コレクション・ステータス・フラグは`FALSE`に設定されます。コレクションに対して操作（追加、更新、切捨てなど）が行われると、このフラグは`TRUE`に設定されます。

このフラグは、`RESET_COLLECTION_CHANGED`をコールすることで、手動でリセットできます。次に例を示します。

    APEX_COLLECTION.RESET_COLLECTION_CHANGED (
        p_collection_name => collection name)

このフラグをリセットした後にコレクションが変更されたかどうかを判別するには、`COLLECTION_HAS_CHANGED`をコールします。次に例を示します。

    l_changed := APEX_COLLECTION.COLLECTION_HAS_CHANGED(
      p_collection_name => collection_name);

`p_generated_md5`パラメータが`YES`に設定されている場合、コレクションに新しいメンバーを追加すると、50個のすべての属性とCLOB属性に対してMD5メッセージ・ダイジェストが計算されます。この値には`APEX_CCOLLECTION`ビューの`MD5_ORIGINAL`列からアクセスできます。`GET_MEMBER_MD5`ファンクションを使用して、指定したコレクション・メンバーの現在の値に対するMD5メッセージ・ダイジェストにアクセスできます。次に例を示します。

    APEX_COLLECTION.GET_MEMBER_MD5 (
        p_collection_name => collection name,
        p_seq             => member sequence number );
        RETURN VARCHAR2;

### コレクションのマージ

コレクションのメンバーを、配列の集合として渡した値とマージできます。`p_init_query`引数を使用することで、指定した問合せからコレクションを作成できます。次に例を示します。

    APEX_COLLECTION.MERGE_MEMBERS
    p_collection_name => collection_name

コレクションが存在する場合、次のことが発生することに注意してください。

- コレクション内に存在し、配列内に存在しない行が削除されます。

- コレクションおよび配列内の行が更新されます。

- 配列内に存在し、コレクション内に存在しない行が挿入されます。

4,000文字を超える属性値は、4,000文字に切り捨てられます。表13-1に、コレクションのマージに使用可能な引数を示します。

表13-1 コレクションのマージに使用可能な引数

引数 | 説明
--- | ---
`p_c001` | マージされる1番目の属性値の配列です。最大長は4,000文字です。最大長より大きい値は4,000文字に切り捨てられます。 P_C001 PL/SQL表内の要素数は、すべてのPL/SQL表内のアイテムの合計数として使用されます。たとえば、P_C001.count = 2およびP_C002.count = 10の場合、2つのメンバーのみがマージされます。P_C001がNULLの場合は、アプリケーション・エラーが発生することに注意してください。
`p_c0xx` | マージされる`XX`番目の属性値の属性です。最大長は4,000文字です。最大長より大きい値は4,000文字に切り捨てられます。
`p_collection_name` | コレクションの名前です。 参照: 「コレクションの名前の指定」
`p_null_index` | マージ・ファンクションで無視する行を識別するために使用します。この引数は、行をNULLとして識別します。NULL行は、コレクションから自動的に削除されます。
`p_null_value` | `p_null_index`と組み合せて使用します。この引数は、NULL値を識別します。この値をNULLにすることはできません。この引数の通常の値は0（ゼロ）です。
`p_init_query` | コレクションが存在しない場合に、この引数によって定義した問合せを使用してコレクションを作成できます。

### コレクションの管理

コレクションの管理には、次のユーティリティを使用できます。

このセクションの構成は次のとおりです。

- メンバー数の取得

- コレクションの再順序付け

- コレクションの存在の確認

- メンバーの順序番号の調整

- コレクション・メンバーのソート

#### メンバー数の取得

コレクション内のすべてのメンバーの合計数を戻すには、`COLLECTION_MEMBER_COUNT`を使用します。この数は、コレクション内の順序番号の最大値ではないことに注意してください。次に例を示します。

    l_count := APEX_COLLECTION.COLLECTION_MEMBER_COUNT (
      p_collection_name => collection name );

#### コレクションの再順序付け

要素の順序を保持したままで、コレクションを再順序付けして順序番号の欠落を排除するには、`RESEQUENCE_COLLECTION`を使用します。次に例を示します。

    APEX_COLLECTION.RESEQUENCE_COLLECTION (
       p_collection_name => collection name )

#### コレクションの存在の確認

コレクションが存在するかどうかを確認するには、`COLLECTION_EXISTS`を使用します。次に例を示します。

    l_exists := APEX_COLLECTION.COLLECTION_EXISTS  (
      p_collection_name => collection name );

#### メンバーの順序番号の調整

順序番号を上下に移動することで、コレクション内の特定のメンバーの順序番号を調整できます。順序番号を調整すると、指定した番号が別の番号と入れ替えられます。たとえば、番号2を1つ上に移動すると、2が3になり、3が2になります。

メンバーの順序番号を1つ上に移動するには、`MOVE_MEMBER_UP`を使用します。メンバーの順序番号を1つ下に移動するには、`MOVE_MEMBER_DOWN`を使用します。次に例を示します。

    APEX_COLLECTION.MOVE_MEMBER_DOWN(
        p_collection_name => collection name,
        p_seq             => member sequence number);

これらのいずれかのメソッドの使用中は、次の場合にアプリケーション・エラーが表示されることに注意してください。

- 指定したコレクションが、カレント・ユーザーのカレント・セッションに存在しない場合

- `p_seq`順序番号によって指定されたメンバーが存在しない場合

ただし、指定したメンバーにコレクション内で最も大きい番号または最も小さい番号（`MOVE_MEMBER_UP`または`MOVE_MEMBER_DOWN`のどちらをコールするかによる）が割り当てられている場合、アプリケーション・エラーは戻されません。

#### コレクション・メンバーのソート

コレクションのメンバーを列番号で並べ替えるには、`SORT_MEMBERS`メソッドを使用します。このメソッドは、特定の列番号でコレクションをソートし、各メンバーの順序番号の欠落を排除するように順序番号の再割当ても行います。次に例を示します。

    APEX_COLLECTION.SORT_MEMBERS(
        p_collection_name       => collection name,
        p_sort_on_column_number => column number to sort by);

### コレクションのセッション・ステートのクリア

コレクションのセッション・ステートをクリアすると、コレクションのメンバーを削除できます。ショッピング・カートは、コレクションのセッション・ステートをクリアする必要がある場合のよい例です。ユーザーがショッピング・カートを空にして再度開始するよう要求した場合に、コレクションのセッション・ステートをクリアする必要があります。`CREATE_OR_TRUNCATE_COLLECTION`メソッドをコールするか、`f?p`構文を使用して、コレクションのセッション・ステートを削除できます。

`CREATE_OR_TRUNCATE_COLLECTION`メソッドをコールすると、既存のコレクションが削除され、そのコレクションが再作成されます。次に例を示します。

    APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION(
        p_collection_name       => collection name,

`f?p`構文の6つ目の引数を使用してセッション・ステートをクリアすることもできます。次に例を示します。

    f?p=App:Page:Session::NO:1,2,3,collection name

参照: 「URL構文の理解」

## APEX_ACTIVITY_LOGを使用したカスタム・アクティビティ・レポートの作成

`APEX_ACTIVITY_LOG`ビューには、開発者アクティビティ、アプリケーション実行時アクティビティなど、作業領域のすべてのアクティビティが記録されます。`APEX_ACTIVITY_LOG`使用して、現在の作業領域に関するすべてのアクティビティの問合せを表示できます。たとえば、このビューを使用して、リアルタイムのパフォーマンス分析を提供する特定のアプリケーション内の監視レポートを開発できます。

表13-2に、`APEX_ACTIVITY_LOG`ビューの列を示します。

表13-2 APEX_ACTIVITY_LOGの列

列 | タイプ | 説明
--- | --- | ---
`time_stamp` | DATE | アクティビティがページ・ビューの末尾に記録された日時
`component_type` | VARCHAR2(255) | 今後の使用のための予約
`component_type` | VARCHAR2(255) | 今後の使用のための予約
`component_attribute` | VARCHAR2(4000) | ページのタイトル
`information` | VARCHAR2(4000) | 今後の使用のための予約
`elap` | NUMBER | ページ・ビューの経過時間（秒）。
`num_rows` | NUMBER | ページ上で処理された行数
`userid` | VARCHAR2(255) | ページ・ビューを実行しているユーザーのID
`ip_address` | VARCHAR2(4000) | クライアントのIPアドレス
`user_agent` | VARCHAR2(4000) | クライアントのWebブラウザ・ユーザー・エージェント
`flow_id` | NUMBER | アプリケーションID
`step_id` | NUMBER | ページ番号。
`session_id` | NUMBER | Oracle Application Expressセッション識別子。
`sqlerrm` | VARCHAR2(4000) | SQLエラー・メッセージ
`sqlerrm_component_type` | VARCHAR2(255) | 今後の使用のための予約
`sqlerrm_component_name` | VARCHAR2(255) | 今後の使用のための予約

アクティビティ・ログの領域を節約するため、一意のセッションそれぞれの最初のログ・エントリにのみIPアドレスとWebブラウザ・ユーザー・エージェントが含まれます。

次に、アプリケーション9529に関する過去24時間のページ・ビュー合計数および平均ページ・ビュー時間がユーザーID別に表示されるレポートを作成する方法の例を示します。

    SELECT COUNT(*), AVG(elap), userid
        FROM APEX_ACTIVITY_LOG
     WHERE time_stamp > (SYSDATE-1)
       AND flow_id = 9529
    GROUP BY userid

Application Expressインスタンスでのアクティビティのロギングは2つの異なるログ表を順番に使用することに注意してください。このため、ロギング情報はログのうち古い方の使用可能なエントリのみとなります。アプリケーションの特定のログ情報を常に保持する場合は、所有するアプリケーション表に両方のログ情報をコピーするか、アプリケーションに直接ロギングを実装する必要があります。

参照: 定義の編集ページで、有効なロギングの情報に関する「名前」を参照してください。

## バックグラウンドPL/SQLの実行

`APEX_PLSQL_JOB`パッケージを使用すると、アプリケーションのバックグラウンドでPL/SQLコードを実行できます。操作が完了していない状態でもユーザーがアプリケーションで作業を継続できるため、長時間実行操作の管理に有効な方法です。

このセクションの構成は次のとおりです。

- APEX_PLSQL_JOBパッケージの理解

- システム・ステータスの更新

- プロセスを使用したバックグラウンドPL/SQLの実装

### APEX_PLSQL_JOBパッケージの理解

`APEX_PLSQL_JOB`は、Oracle Databaseで提供される`DBMS_JOB`機能をラップしたラッパー・パッケージです。`APEX_PLSQL_JOB`パッケージでは、PL/SQLをバックグラウンドで実行するために必要な機能のみが公開されることに注意してください。`APEX_PLSQL_JOB` パッケージの記述を次に示します。

    SQL> DESC APEX_PLSQL_JOB
    FUNCTION JOBS_ARE_ENABLED RETURNS BOOLEAN
    PROCEDURE PURGE_PROCESS
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     P_JOB                          NUMBER                  IN
    FUNCTION SUBMIT_PROCESS RETURNS NUMBER
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     P_SQL                          VARCHAR2                IN
     P_WHEN                         VARCHAR2                IN     DEFAULT
     P_STATUS                       VARCHAR2                IN     DEFAULT
    FUNCTION TIME_ELAPSED RETURNS NUMBER
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     P_JOB                          NUMBER                  IN
    PROCEDURE UPDATE_JOB_STATUS
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     P_JOB                          NUMBER                  IN
     P_STATUS                       VARCHAR2                IN
     P_DESC

表13-3に、`APEX_PLSQL_JOB`パッケージで使用可能なファンクションを示します。

表13-3 APEX_PLSQL_JOBパッケージ: 使用可能なファンクション

ファンクションまたはプロシージャ | 説明
--- | ---
`SUBMIT_PROCESS` | このプロシージャを使用すると、バックグラウンドPL/SQLを送信できます。このプロシージャは、一意のジョブ番号を戻します。このジョブ番号は、このパッケージ内の他のプロシージャおよびファンクションの参照点として使用できるため、自分のスキーマ内に格納しておくと役に立ちます。
`UPDATE_JOB_STATUS` | このプロシージャをコールすると、現在実行しているジョブのステータスを更新できます。このプロシージャは、送信されたPL/SQLからコールされたときに最も有効です。
`TIME_ELAPSED` | このファンクションを使用すると、ジョブが送信されてから経過した時間を確認できます。
`JOBS_ARE_ENABLED` | このファンクションをコールすると、そのデータベースが現在、`APEX_PLSQL_JOB`パッケージへのジョブの送信をサポートするモードであるかどうかを確認できます。
`PURGE_PROCESS` | このプロシージャをコールすると、送信されたジョブをクリーンアップできます。送信されたジョブは、Oracle Application Expressによってそれらのレコードがクリーンアップされるか、または`PURGE_PROCESS`のコールによって手動で削除するまで、`APEX_PLSQL_JOBS`ビューに保持されます。

`APEX_PLSQL_JOB`パッケージに送信したすべてのジョブは、`APEX_PLSQL_JOBS`ビューで表示できます。`APEX_PLSQL_JOBS`ビューの記述を次に示します。

    SQL> DESCRIBE APEX_PLSQL_JOBS
     Name                              Null?    Type
     --------------------------------- -------- ----------------------------
     ID                                         NUMBER
     JOB                                        NUMBER
     FLOW_ID                                    NUMBER
     OWNER                                      VARCHAR2(30)
     ENDUSER                                    VARCHAR2(30)
     CREATED                                    DATE
     MODIFIED                                   DATE
     STATUS                                     VARCHAR2(100)
     SYSTEM_STATUS                              VARCHAR2(4000)
     SYSTEM_MODIFIED                            DATE
     SECURITY_GROUP_ID                          NUMBER

表13-4に、`APEX_PLSQL_JOBS`ビューで使用可能な列を示します。

表13-4 APEX_PLSQL_JOBSビュー列

名前 | 説明
--- | ---
`ID` | 列ごとに一意の識別子です。
`JOB` | 送信された各PL/SQLジョブに割り当てられたジョブ番号です。この値を戻すには、`APEX_PLSQL_JOB.SUBMIT_PROCESS`ファンクションを使用します。これは、`APEX_PLSQL_JOB`パッケージ内の他のプロシージャおよびファンクションに渡す値でもあります。
`FLOW_ID` | このジョブの送信元のアプリケーションです。
`OWNER` | アプリケーションを所有するデータベース・スキーマです。この値は、`DBMS_JOB`がこのコードを実行する際に、コードを解析するスキーマを識別します。
`ENDUSER` | このプロセスを送信させたエンド・ユーザー（アプリケーションにログインしたユーザー）です。
`CREATED` | ジョブが送信された日付です。
`MODIFIED` | ステータスが変更された日付です。
`STATUS` | このジョブに対してユーザーが定義したステータスです。この列を更新するには、`APEX_PLSQL_JOB.UPDATE_JOB_STATUS`をコールします。
`SYSTEM_STATUS` | このジョブに対してシステムが定義したステータスです。
`SYSTEM_MODIFIED` | システム・ステータスが変更された日付です。
`SECURITY_GROUP_ID` | 作業領域に割り当てられた一意のIDです。開発者は、自分の作業領域から送信されたジョブのみを参照できます。

### システム・ステータスの更新

送信されたジョブには、次のいずれかのシステム・ステータス設定が含まれています。

- SUBMITTED: ジョブが送信済であるが、開始されていないことを示します。DBMS_JOBでは、ジョブの即時開始は保証されていません。

- IN PROGRESS: `DBMS_JOB`がプロセスを開始したことを示します。

- COMPLETED: ジョブが完了したことを示します。

- BROKEN (sqlcode) sqlerrm: ジョブに問題があり、エラーが発生したことを示します。エラーが発生したことを示すSQLコードおよびSQLエラー・メッセージがシステム・ステータスに表示されます。この情報を参照して、エラーの原因を判別してください。

### プロセスを使用したバックグラウンド PL/SQLの実装

テストおよび説明用に、PL/SQLジョブをバックグラウンドで実行する例を次に示します。

    001  BEGIN
    002    FOR i IN 1 .. 100 LOOP
    003      INSERT INTO emp(a,b) VALUES (:APP_JOB,i);
    004      IF MOD(i,10) = 0 THEN
    005        APEX_PLSQL_JOB.UPDATE_JOB_STATUS(
    006          P_JOB     => :APP_JOB,
    007          P_STATUS  => i || 'rows inserted');
    008      END IF;
    009      APEX_UTIL.PAUSE(2);
    010    END LOOP;
    011  END;

この例の説明を次に示します。

- 002から010行では、100個のレコードを`emp`表に挿入するループを実行します。

- `APP_JOB`は、INSERTのVALUE句内でバインド変数として参照され、`UPDATE_JOB_STATUS`へのコール内で`P_JOB`パラメータの値として指定されます。

- `APP_JOB`は、`APEX_PLSQL_JOB`に送信される際に、このプロセスに割り当てられるジョブ番号を表します。プロセス・コード内にこの予約アイテムを指定すると、実行時に実際のジョブ番号に置換されます。

- この例では、コード・ブロック内で、10個のレコードごとに`UPDATE_JOB_STATUS`がコールされることに注意してください。通常、Oracleトランザクション規則では、コード・ブロック内で実行された更新は、トランザクション全体がコミットされるまで表示されません。一方、`APEX_PLSQL_JOB.UPDATE_JOB_STATUS`プロシージャは、ジョブが成功したか失敗したかにかかわらず更新を実行するように実装されています。このことは、次の2つの理由から重要です。

  1. 「100行が挿入されました」というステータスが表示される場合でも、操作全体が成功したわけではありません。コード・ブロックでコミットが試行されたときにエラーが発生した場合、ステータスの更新は個別にコミットされるため、`APEX_PLSQL_JOBS`の`user_status`列は影響を受けません。

  2. 更新は自律的に実行されます。ジョブが完了する前にジョブ・ステータスを表示できます。これによって、バックグラウンドで実行中の各操作についてステータス・テキストを表示できます。

## Webサービスの実装

Webサービスを使用すると、アプリケーション同士がWeb上でプラットフォームおよび言語に依存しない環境で相互に通信できます。通常のWebサービス・シナリオでは、ビジネス・アプリケーションが、HTTPプロトコルを使用して、特定のURLにあるサービスに対してリクエストを送信します。サービスは、リクエストを受信すると、これを処理し、レスポンスを返します。外部Webサービスへのコールをアプリケーション・ビルダーで開発されたアプリケーションに組み込むことができます。

Webサービスは、Simple Object Access Protocol（SOAP）に基づいています。SOAPは、World Wide Web Consortium（W3C）が策定した、インターネットを介したリクエストとレスポンスの送受信用の標準プロトコルです。SOAPメッセージは、サービス・プロバイダとサービス・ユーザー間でSOAPエンベロープに入れて送受信できます。

SOAPには、主に2つのメリットがあります。

- SOAPはXMLをベースとしており、使用方法も容易です。

- このプロトコルではHTTPなどの単純な転送プロトコルが使用されているため、SOAPメッセージはファイアウォールでブロックされることはありません。

ヒント: Oracle Application ExpressをOracle Database 11g リリース1（11.1）以上と同時に実行している場合は、Webサービスを使用するためにネットワーク・サービスを有効にする必要があります。「Oracle Database 11gのネットワーク・サービスの有効化」を参照してください。

このセクションの構成は次のとおりです。

- Webサービス参照の理解

- SSL有効Webサービスでの作業

- WSDLに基づいたWebサービス参照の作成

- Webサービス参照リポジトリの使用

- WSDLから作成されたWebサービス参照のテスト

- 手動作成されたWebサービス参照のテスト

- Webサービスでの入力フォームとレポートの作成

- Webサービスでのフォームの作成

- プロセスとしてのWebサービスの起動

- Webサービス・プロセスの編集

- Webサービス参照履歴の表示

注意: SOAP 1.1仕様はW3C覚書です。（SOAPより優先される標準を作成するために、W3C XML Protocol Working Groupが結成されています。） Simple Object Access Protocol（SOAP）1.1については、次のWebサイトを参照してください。
    http://www.w3.org/TR/SOAP/

### Webサービス参照の理解

Oracle Application ExpressでWebサービスを使用するには、ウィザードを使用してWebサービス参照を作成します。Webサービス参照は、Web Services Description Language（WSDL）ドキュメントに基づくか、サービスに関する情報を参照して手動で作成することができます。

WSDLに基づいてWebサービス参照を作成する場合、ウィザードはWSDLを分析し、すべての必要な情報を収集して、次を含んだ有効なSOAPメッセージを作成します。

- HTTP（S）を介したSOAPリクエストのポストに使用するURL

- SOAP HTTPリクエストを識別するUniversal Resource Identifier（URI）

- Webサービスの操作

- 各操作の入力パラメータ

- 各操作の出力パラメータ

手動でWebサービス参照を作成する場合、必要な情報を指定して、次を含んだ有効なSOAPリクエストを作成します。

- HTTP（S）を介したSOAPリクエストのポストに使用するURL

- SOAP HTTPリクエストを識別するUniversal Resource Identifier（URI）

- アイテムの置換を含んだリクエストのSOAPエンベロープ

- オプションで、Webサービスからのレスポンスを格納するコレクション名

#### Webサービス参照ページへのアクセス

Webサービス参照は、「Webサービス参照」ページで管理します。

「Webサービス参照」ページにアクセスするには、次のステップを実行します。

1. 「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。

2. アプリケーションを選択します。

   アプリケーション・ビルダーが表示されます。

3. 「共有コンポーネント」をクリックします。

   共有コンポーネント・ページが表示されます。

4. 「ロジック」で、「Webサービス参照」をクリックします。

   「Webサービス参照」ページが表示されます。

#### アプリケーション・プロキシ・サーバー・アドレスの指定

インターネットのアクセスにプロキシ・サーバーが必要な環境の場合は、Webサービス参照を作成する前に「アプリケーション属性」ページでプロキシ・サーバー・アドレスを指定する必要があります。

アプリケーションにプロキシ・アドレスを指定するには、次のステップを実行します。

1. 「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。

2. アプリケーションを選択します。

   アプリケーションのホームページが表示されます。

3. 「共有コンポーネント」をクリックします。

4. 「アプリケーション」で、「定義」をクリックします。

5. 「名前」で、「プロキシ・サーバー」フィールドにプロキシ・サーバーを入力します。

6. 「変更の適用」をクリックします。

### SSL有効Webサービスでの作業

Secure Sockets Layer（SSL）は、RSA公開鍵による暗号化と対称鍵による暗号化を組み合せて、認証、暗号化およびデータの整合性を実現する業界標準プロトコルです。

通信する必要のあるWebサービスがSSL対応の場合（Webサービスに対するURLに`https`と表示される）、ウォレットを作成する必要があります。ウォレットは、SSLに必要な認証および署名された資格証明（秘密鍵、証明書および信頼できる証明書）の格納に使用されるパスワード保護されたコンテナです。

参照: 「ウォレット情報の構成」

### WSDLに基づいたWebサービス参照の作成

WSDLに基づいたWebサービス参照を作成する場合、WSDLの位置の特定方法を決定する必要があります。WSDLの位置の特定には、次の2つの方法があります。

- Universal Description, Discovery and Integration（UDDI）レジストリを検索する

- WSDLドキュメントのURLを入力する

UDDIレジストリは企業がWebサービスを登録するディレクトリです。

このセクションの構成は次のとおりです。

- UDDIレジストリの検索によるWebサービス参照の作成

- WSDLドキュメントの指定によるWebサービス参照の作成

- Webサービス参照の手動作成

#### UDDIレジストリの検索によるWebサービス参照の作成

UDDIレジストリを検索して、新しいWebサービスを作成するには、次のステップを実行します。

1. Webサービス参照ページにナビゲートします。「Webサービス参照ページへのアクセス」を参照してください。

2. 「作成」をクリックします。

3. WSDLを検出するためにUDDIレジストリを検索することを確認するプロンプトが表示されたら、「はい」をクリックします。

4. 「UDDIの位置」では、次のいずれかを実行できます。

   - UDDIレジストリへのURLエンドポイントを入力する。

   - 「リスト」 アイコンをクリックして、UDDIレジストリを選択する。

5. 「検索」で、次を指定します。

   1. 検索タイプ: ビジネス名またはサービス名のどちらを検索するかを指定します。両方を検索することはできません。

   2. 名前: 検索に使用するビジネス名またはサービス名を入力します。ワイルドカードにはパーセント（%）を使用します。

   3. オプションで、完全一致検索または大文字/小文字を区別する検索を指定できます。

   4. 「検索」をクリックします。

   5. 検索結果が表示されたら、選択した後で「次へ」をクリックします。

   選択したWebサービスについて説明するサマリー・ページが表示されます。

6. 選択内容を確認し、「次へ」をクリックして続行します。

   WSDLドキュメントへのURLが「WSDLの位置」フィールドに表示されます。

7. 「終了」をクリックします。

Webサービス参照がWebサービス参照リポジトリに追加されます。

#### WSDLドキュメントの指定によるWebサービス参照の作成

特定のWSDLドキュメントへのURLを指定して、新しいWebサービスを作成するには、次のステップを実行します。

1. Webサービス参照ページにナビゲートします。「Webサービス参照ページへのアクセス」を参照してください。

2. 「作成」をクリックします。

3. WSDLを検出するためにUDDIレジストリを検索することを確認するプロンプトが表示されたら、「いいえ」をクリックします。

4. 「WSDLの位置」に、WSDLドキュメントへのURLを入力します。

5. 「終了」をクリックします。

Webサービス参照がWebサービス参照リポジトリに追加されます。

#### Webサービス参照の手動作成

新規のWebサービス参照を手動作成するには、次のステップを実行します。

1. Webサービス参照ページにナビゲートします。「Webサービス参照ページへのアクセス」を参照してください。

2. 「作成」をクリックします。

3. WSDLを検出するためにUDDIレジストリを検索することを確認するプロンプトが表示されたら、「いいえ」をクリックします。

4. 「タスク」リストで、「Webサービス参照の手動作成」をクリックします。

   Webサービスの作成/編集ページが表示されます。

5. 「名前」で、参照を識別する名前を入力します。

6. 「サービスの説明」には、次の項目があります。

   1. URL: WebサービスのURLエンドポイントを入力します。

   2. アクション: Webサービスのアクションを入力します（オプション）。

   3. プロキシ: このサービスのアプリケーション・プロキシを上書きする場合、プロキシを入力します。

   4. Basic認証: Webサービスが認証を必要とするかどうかを選択します。「はい」または「いいえ」を選択します。

7. 「SOAPエンベロープ」で、このリクエストのSOAPエンベロープを入力します。

8. 「コレクションにレスポンスを格納」で、レスポンスを格納するコレクション名を入力します（オプション）。

9. 「作成」をクリックします。

Webサービス参照がWebサービス参照リポジトリに追加されます。

### Webサービス参照リポジトリの使用

Webサービス参照がWebサービス参照リポジトリに格納されます。

Webサービス参照リポジトリにアクセスするには、次のステップを実行します。

1. 「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。

2. アプリケーションを選択します。

   アプリケーション・ビルダーが表示されます。

3. 「共有コンポーネント」をクリックします。

   共有コンポーネント・ページが表示されます。

4. 「ロジック」で、「Webサービス参照」をクリックします。

   Webサービス参照ページが表示されます。

   ページ上部の「ナビゲーション」バーを使用して、Webサービス参照の検索またはページ表示の変更を行います。使用可能なオプションは次のとおりです。

   - Webサービス参照: 参照名に大/小文字を区別しない問合せを入力して、「実行」をクリックします。すべてのWebサービス参照を表示するには、フィールドを空白のままにして「実行」をクリックします。

   - ビュー: 表示モードを選択して「実行」をクリックします。使用可能なオプションは次のとおりです。

     - アイコン（デフォルト）: 各Webサービス参照を大きいアイコンとして表示します。Webサービス参照を編集するには、該当するアイコンをクリックします。

     - 詳細 : 各Webサービス参照をレポートで1行に表示します。

5. 「ビュー」リストから「詳細」を選択して、「実行」をクリックします。

6. 「詳細」ビューでは、次の操作を実行できます。

   - 参照名をクリックして参照を編集します。

   - 「実行」アイコンをクリックして参照をテストします。

   - 「ビュー」アイコンをクリックして参照に関する詳細を表示します。このオプションは、手動作成されたWebサービス参照には使用できないことに注意してください。

### WSDLから作成されたWebサービス参照のテスト

Webサービス参照を作成した後、「Webサービス参照のテスト」ページでテストできます。

Webサービス参照をテストするには、次のステップを実行します。

1. Webサービス参照ページにナビゲートします。「Webサービス参照ページへのアクセス」を参照してください。

2. 「ビュー」から、「詳細」を選択します。

3. Webサービス参照名の横にある「 実行 」アイコンをクリックします。

   「Webサービス参照のテスト」ページが表示されます。ページの上部に、Webサービス名とURLエンドポイントが表示されます。

4. 「操作」から、実行する操作を選択します。

5. 「入力パラメータ」で、適切な値を入力します。

6. 「テスト」をクリックします。

   ページの下部に、メッセージ・リクエストとレスポンスが表示されます。

### 手動作成されたWebサービス参照のテスト

Webサービス参照を作成した後、「Webサービス参照のテスト」ページでテストできます。

Webサービス参照をテストするには、次のステップを実行します。

1. Webサービス参照ページにナビゲートします。「Webサービス参照ページへのアクセス」を参照してください。

2. 「ビュー」から、「詳細」を選択します。

3. Webサービス参照名の横にある「 実行 」アイコンをクリックします。

   「Webサービス参照のテスト」ページが表示されます。ページの上部に、Webサービス名とURLエンドポイントが表示されます。

4. 必要に応じて、「Basic認証」でユーザー名およびパスワードを入力します。

5. 「SOAPエンベロープ」テキスト領域では、オプションで、SOAPリクエスト・エンベロープを編集します。

6. 「テスト」をクリックします。

   ページの下部に、メッセージ・リクエストとレスポンスが表示されます。

### Webサービスでの入力フォームとレポートの作成

Webサービスのフォームとレポートの作成ウィザードでは、入力フォーム、送信ボタンおよび結果を表示するレポートが作成されます。WSDLからWebサービス参照を作成した直後、または新しいページを追加して、このウィザードを実行できます。

このウィザードは、Webサービスの結果が非スカラーであることが予想される場合に使用します。Amazon社のWebサービスがよい例です。このWebサービスでは、入力フォームに入力された検索基準に基づいて多くの結果が戻されます。

#### 参照を作成した後のフォームとレポートの作成

Webサービス参照を作成した後に、フォームとレポートを作成するには、次のステップを実行します。

1. Webサービス参照を作成します。「WSDLに基づいたWebサービス参照の作成」を参照してください。

2. Webサービス参照が追加された後で、「Webサービスのフォームとレポートの作成」を選択します。

3. 「サービスと操作の選択」で、次の操作を実行します。

   1. Webサービス参照: Webサービス参照を選択します。

   2. 操作: 実行方法を選択します。

4. 「ページおよびリージョン属性」で、表示された属性を確認します。指定したページが存在しない場合は、ウィザードによってページが作成されます。

5. 「入力アイテム」で、次の操作を実行します。

   1. フォームに追加するアイテムを指定します。アイテムを含めるには、「作成」列で「はい」を選択します。アイテムを含めない場合は、「いいえ」を選択します。

   2. 必要に応じて、アイテム・ラベルを編集します。

6. 該当する場合、Basic認証に「アイテム名」および「アイテム・ラベル」を指定します。このステップは、Basic認証が作成時にこのWebサービス参照に対して指定された場合にのみ表示されることに注意してください。

7. ウィンドウ・サービスの結果で、次の操作を実行します。

   1. 一時結果セット名: Webサービスの結果を格納するコレクションの名前を入力します。

   2. レポート対象の結果ツリー: 作成されるXML文書（レポートに含める情報を含む）の一部を選択します。

8. 「表示する結果パラメータ」で、レポートに含めるパラメータを選択します。

9. 「終了」をクリックします。

#### 新しいページの追加によるフォームとレポートの作成

既存のWebサービス参照がある場合は、新しいページを追加して、入力フォームとレポートを作成できます。

新しいページを追加して、フォームとレポートを作成するには、次のステップを実行します。

1. Webサービス参照を作成します。「WSDLに基づいたWebサービス参照の作成」を参照してください。

2. 新しいページを作成します。「アプリケーション内のページの管理」を参照してください。

   「ページの作成」ウィザードで、次のステップを実行します。

   1. 「フォーム」を選択します。

   2. 「Webサービスのフォームとレポート」を選択します。

3. 「サービスと操作の選択」で、次の操作を実行します。

   1. Webサービス参照: Webサービス参照を選択します。

   2. 操作: 実行方法を選択します。

4. 「ページおよびリージョン属性」で、ページとリージョン属性を確認します。指定したページが存在しない場合は、ウィザードによってページが作成されます。

5. 「入力アイテム」で、次の操作を実行します。

   1. フォームに追加するアイテムを指定します。アイテムを含めるには、「作成」列で「はい」を選択します。アイテムを含めない場合は、「いいえ」を選択します。

   2. 必要に応じて、アイテム・ラベルを編集します。

6. 該当する場合、Basic認証に「アイテム名」および「アイテム・ラベル」を指定します。このステップは、Basic認証が作成時にこのWebサービス参照に対して指定された場合にのみ表示されることに注意してください。

7. 画面に表示されるステップに従います。

8. 「終了」をクリックします。

### Webサービスでのフォームの作成

Webサービスのフォームの作成ウィザードでは、フォームと送信ボタンが作成されます。WSDLのWebサービス参照を作成した後に、またはページ定義から、このウィザードを実行できます。

このウィザードは、Webサービスの結果がスカラーであることが予想される場合に使用します。株価を調べるWebサービスがよい例です。入力は銘柄記号で、出力はスカラーの適正価格であるためです。

#### 参照を作成した後のフォームの作成

Webサービス参照を作成した後に、フォームを作成するには、次のステップを実行します。

1. Webサービス参照を作成します。「WSDLに基づいたWebサービス参照の作成」を参照してください。

2. Webサービス参照が追加された後で、「Webサービスのフォームの作成」を選択します。

3. 「サービスと操作の選択」で、次の操作を実行します。

   1. Webサービス参照: Webサービス参照を選択します。

   2. 操作: 実行方法を選択します。

4. 「ページおよびリージョン属性の指定」で、ページとリージョン属性を確認します。指定したページが存在しない場合は、ウィザードによってページが作成されます。

5. 「入力パラメータのアイテム」で、次の操作を実行します。

   1. 追加するアイテムを指定します。アイテムを含めるには、「作成」列で「はい」を選択します。アイテムを含めない場合は、「いいえ」を選択します。

   2. 必要に応じて、アイテム・ラベルを編集します。

6. 「出力パラメータのアイテム」で、次の操作を実行します。

   1. 追加する必要があるアイテムを指定します。アイテムを含めるには、「作成」列で「はい」を選択します。アイテムを含めない場合は、「いいえ」を選択します。

   2. 必要に応じて、アイテム・ラベルを編集します。

7. 該当する場合、Basic認証に「アイテム名」および「アイテム・ラベル」を指定します。

   このステップは、Webサービス参照を作成したときに、Basic認証がこのWebサービス参照に対して指定された場合にのみ表示されることに注意してください。

8. 「終了」をクリックします。

#### 新しいページの追加によるフォームの作成

WSDLから作成された既存のWebサービス参照がある場合は、新しいページを追加して、フォームを作成できます。

新しいページを追加して、フォームを作成するには、次のステップを実行します。

1. Webサービス参照を作成します。「WSDLに基づいたWebサービス参照の作成」を参照してください。

2. 新しいページを作成します。「アプリケーション内のページの管理」を参照してください。

   「ページの作成」ウィザードで、次のステップを実行します。

   1. 「フォーム」を選択します。

   2. 「Webサービスのフォーム」を選択します。

3. 「Webサービス参照と操作」で、Webサービス参照および実行する操作を選択します。

4. 「ページおよびリージョン属性の指定」で、ページとリージョン属性を確認します。指定したページが存在しない場合は、ウィザードによってページが作成されます。

5. 「入力パラメータのアイテム」で、次の操作を実行します。

   1. 追加する必要があるアイテムを指定します。アイテムを含めるには、「作成」列で「はい」を選択します。アイテムを含めない場合は、「いいえ」を選択します。

   2. 該当する場合、Basic認証に「アイテム名」および「アイテム・ラベル」を指定します。

      このステップは、Webサービス参照を作成したときに、Basic認証がこのWebサービス参照に対して指定された場合にのみ表示されることに注意してください。

6. 「出力パラメータのアイテム」で、次の操作を実行します。

   1. 追加する必要があるアイテムを指定します。アイテムを含めるには、「作成」列で「はい」を選択します。アイテムを含めない場合は、「いいえ」を選択します。

   2. 必要に応じて、アイテム・ラベルを編集します。

7. 「終了」をクリックします。

### プロセスとしてのWebサービスの起動

ページ上で、Webサービスをプロセスとして実装することもできます。このプロセスを実行すると、リクエストがサービス・プロバイダに送信されます。その後で、レポートにリクエスト結果を表示できます。

Webサービスをプロセスとして起動するには、次のステップを実行します。

1. 新しいページを作成します。「アプリケーション内のページの管理」を参照してください。

   「ページの作成」ウィザードで、次のステップを実行します。

   1. 「空白ページ」を選択します。

   2. タブの使用を確認するプロンプトが表示されたら、「いいえ」を選択します。

2. 「ページ定義」にナビゲートします。「ページ定義へのアクセス」を参照してください。

3. 「ページ・レンダリング」の「プロセス」で、「作成」アイコンをクリックします。

   「ページ・プロセスの作成」ウィザードが表示されます。

4. プロセスのカテゴリから、「Webサービス」を選択します。

5. プロセス名、順序およびプロセス・ポイントを指定します。

6. Webサービス参照を選択します。

   Web参照がWSDLから作成された場合、次の追加のステップを実行します。

7. Webサービス参照および実行する操作を選択します。

8. プロセスを定義します。「Webサービスの出力パラメータ」でオプションを選択すると、結果をコレクションまたはページ上のアイテムに格納できます。

   1. コレクションに結果を格納するには、次のステップを実行します。

      - 「結果の格納場所」で、「コレクション」を選択します。

      - 「値」フィールドにコレクションの名前を入力します。

   2. ページ上のアイテムに結果を格納するには、次のステップを実行します。

      - 「結果の格納場所」で、「アイテム」を選択します。

      - 表示されるフィールドに該当するアイテムの値を入力します。

9. 「プロセスの作成」をクリックします。

#### レポートでのWebサービス結果の表示

Webサービスのリクエスト結果を表示するレポートを作成するには、次のステップを実行します。

1. 「ページ定義」にナビゲートします。「ページ定義へのアクセス」を参照してください。

2. 「リージョン」で、「作成」アイコンをクリックします。

   「リージョンの作成」ウィザードが表示されます。

3. 「リージョン・タイプ」で、「レポート」を選択します。

4. 「レポート実装」で、「Webサービスの結果を含むコレクションのレポート」を選択します。「リージョン属性を指定」で、リージョン・タイトルを入力し、オプションでリージョン属性を編集します。

5. Web参照が手動で作成されたか、またはWSDLから作成されたかを選択します。

6. Webサービス参照がWSDLから作成された場合、次のステップを実行します。

   1. 「Webサービス参照と操作」で、Webサービス参照および実行する操作を選択します。

   2. 「レポート対象の結果ツリー」で、作成されるXML文書（レポートに含める情報を含む）の一部を選択します。

   3. 「結果パラメータ」で、次の操作を実行します。

      - 「一時結果セット名」に、Webサービスの結果を格納するコレクションの名前を入力します。

      - 該当するパラメータを選択した後、選択解除します。

7. Webサービス参照が手動で作成された場合、次のステップを実行します。

   1. Webサービス参照を選択します。

   2. SOAPスタイルを選択します。

   3. メッセージの書式を選択します。

   4. レポートの対象となるノードへのXPath式を入力します。

   5. SOAPレスポンス・エンベロープのネームスペースを入力して、「次へ」をクリックします。

   6. レスポンス・メッセージが格納されているコレクション名を入力します。

   7. レポートに含めるパラメータ名を入力します。

8. 「SQLレポートの作成」をクリックします。

### Webサービス・プロセスの編集

WSDLから作成されたWebサービス参照のWebサービス・タイプのプロセスを作成した後で、Webサービス・プロセスを編集すると、入力パラメータを静的な値にマップできます（たとえば、キーを渡すなど）。

Webサービス・プロセスを編集するには、次のステップを実行します。

1. Webサービス・プロセスを作成します。詳細は、「プロセスとしてのWebサービスの起動」を参照してください。

2. Webサービス・プロセスが含まれているページ定義にナビゲートします。

3. プロセス名を選択します。

   「ページ・プロセスの編集」ページが表示されます。

4. 入力パラメータを静的な値にマップするには、次のステップを実行します。

   1. 「Webサービスの入力パラメータ」までスクロールします。

   2. 該当するパラメータ名の横にある「値」フィールドに値を入力します。

5. 「変更の適用」をクリックします。

### Webサービス参照履歴の表示

「Webサービス履歴」では、カレント・アプリケーションのWebサービス参照の変更が、アプリケーションID、Webサービス参照名、開発者および日付ごとに表示されます。

Webサービス参照の変更履歴を表示するには、次のステップを実行します。

1. 「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。

2. アプリケーションを選択します。

   アプリケーション・ビルダーが表示されます。

3. 「共有コンポーネント」をクリックします。

   共有コンポーネント・ページが表示されます。

4. 「ロジック」で、「Webサービス参照」をクリックします。

5. 「履歴」をクリックします。

注意: 「Webサービス参照」ページに「履歴」ボタンが表示されるのは、Webサービス参照を作成した後のみです。