プライマリ・コンテンツに移動

Oracle® Application Expressアプリケーション・ビルダー・ユーザーズ・ガイド リリース5.1 E83810-03 |
| 目次 | 索引

前 | 次 |

# 2.8 セッション・ステート値の管理

インタラクティブな、データに応じて動作するWebアプリケーションを構築するには、セッション・ステート値にアクセスして管理する機能が重要です。Oracle Application Expressでは、セッション・ステートはページごとに自動的に管理され、静的HTML、またはプロセスや検証などのロジック・コントロールによって簡単に参照できます。

トピック:

- セッション・ステートの参照について
- セッション・ステートの設定
- セッション・ステートのクリア
- バインド変数構文を使用したセッション・ステートの参照
- セッション・クローニングについて

関連項目:

アイテム値の参照

## 2.8.1 セッション・ステートの参照について

リージョン、計算、プロセス、検証およびブランチのセッション・ステートに格納されているアイテム値を参照できます。アイテムはフィールド、テキスト領域、パスワード、選択リスト、チェック・ボックスなどです。表2-3に、アイテム値を参照するためにサポートされている構文を示します。

表2-3 アイテム値を参照するための構文

データ型 | 構文 | 説明
--- | --- | ---
SQL | 標準のアイテム構文: `:MY_ITEM` 特殊文字を含むアイテム用の構文は次のとおりです。 `:"MY_ITEM"` | 名前が30文字以内のアイテムは、コロン(:)にアイテム名を続けます。この構文は、SQL問合せおよびPL/SQL内の参照用に使用します。 特殊文字、マルチバイト文字またはunicode文字を含むページ・アイテムを参照するには、ページ・アイテム名を二重引用符で囲みます。
PL/SQL | `V('MY_ITEM')` | `V`ファンクションを使用してアイテム値を参照するPL/SQL構文を使用します。`APEX_UTIL.GET_SESSION_STATE`のかわりに、短縮版の`V`ファンクションを使用できます。 ファンクション、トリガー、Oracle Data Redactionポリシーなど、Oracle Databaseオブジェクト内で直接Oracle Application Express変数を使用する場合に、この構文を使用します。 関連項目: Oracle Application Express APIリファレンス
PL/SQL | `NV('MY_NUMERIC_ITEM')` | `NV`ファンクションを使用して数値アイテム値を参照する標準のPL/SQL構文を使用します。`APEX_UTIL.GET_NUMERIC_SESSION_STATE`のかわりに、短縮版の`NV`ファンクションを使用できます。 関連項目: Oracle Application Express APIリファレンス
静的テキスト(完全置換) | 標準のアイテム構文: `&MY_ITEM.` 特殊文字を含むアイテム用の構文は次のとおりです。 `&"MY_ITEM".` | 静的テキストまたは完全置換の場合は、`&ITEM_NAME`にピリオド(.)を続けた表記を使用します。 特殊文字、マルチバイト文字またはunicode文字を含むページ・アイテムを参照するには、ページ・アイテム名を二重引用符で囲みます。

## 2.8.2 セッション・ステートの設定

この項では、アプリケーションのアイテム値を設定し、その結果、セッション・ステートを設定する方法について説明します。

トピック:

- セッション・ステートの設定について
- フォーム送信によるセッション・ステートの設定について

### 2.8.2.1 セッション・ステートの設定について

次の方法を使用して、アプリケーションのアイテム値およびセッション・ステートを設定できます。

- フォーム送信。フォーム送信によるセッション・ステートの設定についてを参照してください。

- バインド変数。バインド変数構文を使用したセッション・ステートの参照を参照してください。

- 計算。アプリケーションの計算の理解を参照してください。

- f?p構文。f?p構文を使用したページのリンクについてを参照してください。

### 2.8.2.2 フォーム送信によるセッション・ステートの設定について

ページがユーザーによって送信されると、Application Expressエンジンは、フィールド(アイテム)に入力された値をセッション・ステートに自動的に格納します。たとえば、2つのページを持つアプリケーションが存在すると想定します。このアプリケーションの最初のページには、ユーザーが電話番号を入力できるフォームが含まれています。このフォームは、`P1_PHONENO`という名前のアイテムを作成して定義しています。2番目のページには、ユーザーがフォームに入力する情報を表示する必要があります。

このページが送信されると、Oracle Application Expressによって、電話番号フィールドに入力された値が取得され、今後使用するためにその値が格納されます。2番目のページで、ユーザーが入力した電話番号は、名前`P1_PHONE_NO`を表2-3の適切な構文で使用して、セッション・ステートから取得できます。

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

アプリケーションの開発時に、特定のアイテム、ページ上のすべてのアイテム、アプリケーション内のすべてのページ、または現行のユーザー・セッション用にキャッシュされた値をクリアする必要がある場合があります。キャッシュされた値をクリアすると、その値がNULLにリセットされます。この項では、セッション・ステートのクリアの具体的な例を示します。

トピック:

- アイテムのキャッシュのクリアについて
- すべてのページ・アイテムのキャッシュのクリア
- 例: アプリケーション全体のキャッシュのクリア
- アプリケーションの完全なリセットについて
- カレント・ユーザー・セッションのキャッシュのクリアについて

### 2.8.3.1 アイテムのキャッシュのクリアについて

1つのアイテムのキャッシュをクリアすると、そのアイテムの値がNULLにリセットされます。たとえば、ページがレンダリング用に準備されるときに特定のアイテムの値を確実にNULLにしておく必要がある場合に、この方法を使用します。

次の例では、標準`f?p`構文を使用してアイテムのキャッシュをクリアします。この例では、アプリケーション100のページ5がコールされます。`f?p`構文の`ClearCache`位置に`MY_ITEM`を指定すると、`MY_ITEM`の値が`NULL`にリセットされます。

    f?p=100:5:&APP_SESSION.::NO:MY_ITEM

次の例では、アイテム`THE_EMPNO`および`THE_DEPTNO`の値がリセットされます。

    f?p=100:5:&APP_SESSION.::NO:THE_EMPNO,THE_DEPTNO

### 2.8.3.2 すべてのページ・アイテムのキャッシュのクリア

アプリケーション・アイテムをキャッシュすると、セッション・ステートを効率的に保持できます。ただし、ページ上のすべてのアイテムのキャッシュをクリアする必要がある場合もあります。たとえば、ユーザーが新しい注文を作成するリンクをクリックすると、ページ上のすべてのフィールドがクリアされるようにする必要があると想定します。ページ全体のキャッシュをクリアすることで、ページ上のすべてのアイテムの値をNULLに設定できます。

トピック:

- 例: 2つのページのキャッシュのクリアおよびページ区切りのリセット
- 例: ページのキャッシュのクリアおよびアイテム値の引渡し
- 例: ページのセッション・キャッシュのクリアおよび複数のアイテムに対する値の引渡し

#### 2.8.3.2.1 例: 2つのページのキャッシュのクリアおよびページ区切りのリセット

この例では、2つのページのセッション・キャッシュがクリアされ、ページ区切りがリセットされます。

    f?p=6000:6003:&APP_SESSION.::NO:RP,6004,6014

この例では、次のようになります。

- アプリケーション6000のページ6003が実行され、現行のセッションIDが使用されます。

- デバッグ情報を表示しないように指示されます(`NO`)。

- カレント・セッションのキャッシュに保持されたページ6004および6014のアイテムのすべての値がクリアされます。

- ページ6003 (リクエストされたページ)のリージョンのページ区切り(`RP`)がリセットされます。

#### 2.8.3.2.2 例: ページのキャッシュのクリアおよびアイテム値の引渡し

この例では、更新フォームの実装方法を示します。既存の情報をクリアし、アイテムの値(通常、主キー)を設定します。

    f?p=6000:6003:&APP_SESSION.::NO:6003:MY_ITEM:1234

この例では、次のようになります。

- アプリケーション6000のページ6003が実行され、現行のセッションIDが使用されます。

- デバッグ情報を表示しないように指示されます(`NO`)。

- カレント・セッションのキャッシュに保持されたページ6003のアイテムのすべての値がクリアされます。

- `MY_ITEM`というアイテムのセッション・ステートの値を`1234`に設定します。

#### 2.8.3.2.3 例: ページのセッション・キャッシュのクリアおよび複数のアイテムに対する値の引渡し

この例では、更新フォームの実装方法を示します。既存の情報をクリアし、アイテムの値(通常、主キー)を設定し、複数のアイテムに値を渡します。

    f?p=6000:6004:&APP_SESSION.::NO:6003:MY_ITEM1,MY_ITEM2,MY_ITEM3:1234,,5678

この例では、次のようになります。

- アプリケーション6000のページ6004が実行され、現行のセッションIDが使用されます。

- ページ6003のアイテムのカレント・セッションのキャッシュがクリアされます。

- デバッグ情報を表示しないように指示されます(`NO`)。

- `MY_ITEM1`の値が1234、`MY_ITEM2`の値がNULL(プレースホルダとして使用されたカンマによって示される)および`MY_ITEM3`の値が5678に設定されます。

### 2.8.3.3 例: アプリケーション全体のキャッシュのクリア

この例では、`f?p`構文を使用し、キーワードAPPを使用して`Clear Cache`引数を作成することで、アプリケーションのキャッシュがクリアされます。

    f?p=App:Page:Session::NO:APP

### 2.8.3.4 アプリケーションの完全なリセットについて

アプリケーション全体のキャッシュをリセットしても、アプリケーションは完全なリセット状態にはリストアされません。たとえば、アプリケーションに新しいインスタンス開始時の計算やプロセスが含まれている場合、Application Expressエンジンは、該当するアプリケーション・セッションが作成されたときに、これらの計算やプロセスを実行します。その後、キャッシュのクリア・リクエストを処理し、リクエストされたページを表示します。

(セッションIDの追跡にCookieが使用されていない場合に)セッションIDを指定せずにアプリケーションを完全にリセットするには、セッションIDを指定せずにURLを使用するか、または別のアプリケーションから`APEX_UTIL`.`CLEAR_APP_CACHE`をコールして、そのアプリケーションをリクエストする必要があります。セッションIDがCookieを使用して追跡される場合、そのステートをリセットするためにログアウトする必要があります。

### 2.8.3.5 カレント・ユーザー・セッションのキャッシュのクリアについて

アプリケーション・キャッシュをクリアするもう1つの方法は、キーワード`SESSION`を使用して`Clear Cache`引数を作成することです。次に例を示します。

    f?p=6000:6004:12507785108488427528::NO:SESSION

## 2.8.4 バインド変数構文を使用したセッション・ステートの参照

この項では、バインド変数構文を使用してセッション・ステートを参照する方法について説明します。

トピック:

- バインド変数構文の使用について
- SQL問合せまたはLOVに基づいたリージョンでのバインド変数の使用について
- PL/SQLに基づいたリージョンでのバインド変数の使用について

### 2.8.4.1 バインド変数構文の使用について

バインド変数構文は、指定したアイテムのセッション・ステートを参照するためにOracle Application ExpressでSQLまたはPL/SQLを使用する場合はいつでも使用できます。次に例を示します。

    SELECT * FROM employees WHERE last_name like '%' || :SEARCH_STRING || '%'

この例では、検索文字列がページ・アイテムです。リージョン・タイプがSQL問合せとして定義されている場合、標準SQLバインド変数構文を使用して値を参照できます。バインド変数を使用すると、解析済のSQL問合せがデータベースによって再利用されるため、サーバーによるメモリーの使用が最適化されます。

バインド変数構文を使用する場合は、次の規則に注意してください。

- バインド変数名は、アイテム名に対応している必要があります。

- バインド変数名は、大/小文字が区別されません。

- バインド変数名は、30文字以下である必要があります(有効なOracle識別子である必要があります)。

  ページ・アイテム名とアプリケーション・アイテム名は255文字以下に設定できますが、アプリケーション・アイテムをバインド変数構文を使用したSQL内で使用する場合、そのアイテム名は30文字以下で指定する必要があります。

### 2.8.4.2 SQL問合せまたはLOVに基づいたリージョンでのバインド変数の使用について

リージョン・タイプがSQL問合せ、SQL問合せ(SQL問合せを戻すPL/SQLファンクション本体)、またはLOVとして定義されている場合は、次の構文を使用してセッション・ステートを参照できます。

    :MY_ITEM

これを行うための一般的な方法の1つは、セッション・ステート変数を`WHERE句`に組み込むことです。次の例では、アイテム`THE_DEPTNO`の値を、SQL問合せから定義されるリージョンにバインドする方法を示します。

    SELECT last_name, job_id, salary
    FROM employees
    WHERE department_id = :THE_DEPTNO

関連項目:

リージョンについて(リージョンの作成の詳細)

### 2.8.4.3 PL/SQLに基づいたリージョンでのバインド変数の使用について

PL/SQL動的コンテンツとして定義されているリージョン・タイプ、プロセス、計算、検証、条件などについて、リージョンはPL/SQL無名ブロック構文を使用して構成されます。つまり、開始キーワードおよび終了キーワードがPL/SQLブロックを囲むために自動的に追加されます。次に例を示します。

    IF :P1_JOB IS NOT NULL THEN
      INSERT INTO employees (employee_id, first_name, job_id)
      VALUES (:P1_EMP_ID, :P1_NAME, :P1_JOB)
    end if;

この例では、`employee_id`、`first_name`および`job_id`の値には、`P1_EMP_ID`、`P1_NAME`および`P1_JOB`の値が移入されます。

## 2.8.5 セッション・クローニングについて

以前のリリースでは、同じOracle Application Expressアプリケーションで複数のウィンドウ(またはブラウザのタブ)を開くと、多くの問題が発生していました。通常、すべてのブラウザのタブで同じセッションおよびセッション・ステートを共有していたため、予期できない望ましくない結果が発生していました。

現在では、開発者が1つのOracle Application Expressアプリケーションで新しいブラウザ・ウィンドウを開くことができ、そこで個別のセッション識別子を生成して、元のApplication Expressセッションから新しいセッションにセッションの値をコピーできるようになりました。このようにするには、開発者は、エンド・ユーザーが新しいブラウザのタブを開く方法を指定し、`APEX_CLONE_SESSION`の`REQUEST`値を指定する必要があります。次に、URLの例を示します。

`f?p=&APP_ID.:&APP_PAGE_ID.:&APP_SESSION.:APEX_CLONE_SESSION`

この機能を使用する場合、開発者は次のことに注意する必要があります。

- Application Expressセッションに関連するアイドル時間は、すべてのApplication Expressセッション(元の、またはクローニングされたセッション)の影響を受けます。

- ユーザーが1つのセッション(元の、またはクローニングされたセッション)からログアウトすると、他のすべての関連するセッションからもログアウトします。

- セッションの最大存続期間は、元のApplication Expressセッションの機能およびその作成時点です。

- 管理ユーザーは、次のプロシージャを使用してこの機能を有効化または無効化できます。

      apex_instance_admin.set_parameter(
          p_parameter => 'CLONE_SESSION_ENABLED',
          p_value     => 'Y');

関連項目:

Oracle Application Express APIリファレンス