3.8 セッション・ステート値の管理
セッション・ステートを管理して、ユーザーが様々なアプリケーション・ページをナビゲートしたときのユーザーの値を格納および取得します。
インタラクティブな、データに応じて動作するWebアプリケーションを構築するには、セッション・ステート値にアクセスして管理する機能が重要です。Oracle Application Expressでは、セッション・ステートはページごとに自動的に管理され、静的HTML、またはプロセスや検証などのロジック・コントロールによって簡単に参照できます。
- セッション・ステートの参照について
リージョン、計算、プロセス、検証およびブランチのセッション・ステートに格納されているアイテム値を参照します。アイテムはフィールド、テキスト領域、パスワード、選択リスト、チェック・ボックスなどです。 - セッション・ステートの設定について
フォーム送信、バインド変数、計算またはf?p構文を使用してセッション・ステートを設定します。 - セッション・ステートのクリア
キャッシュされた値をクリアすると、その値がNULLにリセットされます。特定のアイテム、ページ上のすべてのアイテム、アプリケーション内のすべてのページ、または現行のユーザー・セッション用にキャッシュされた値をクリアできます。 - バインド変数構文を使用したセッション・ステートの参照
バインド変数構文は、指定したアイテムのセッション・ステートを参照するためにSQLまたはPL/SQLを使用する場合に使用します。 - セッション・クローニングについて
セッション・クローニングを使用して、1つのOracle Application Expressアプリケーションで新しいブラウザ・ウィンドウを開き、そこで新しい個別のセッション識別子を生成して、元のApplication Expressセッションから新しいセッションにセッションの値をコピーします。
関連項目:
親トピック: アプリケーション・ビルダーの概念
3.8.1 セッション・ステートの参照について
リージョン、計算、プロセス、検証およびブランチのセッション・ステートに格納されているアイテム値を参照します。アイテムはフィールド、テキスト領域、パスワード、選択リスト、チェック・ボックスなどです。
次の表は、アイテム値を参照するためにサポートされている構文について説明しています。
表 3-2 アイテム値を参照するための構文
親トピック: セッション・ステート値の管理
3.8.2 セッション・ステートの設定について
フォーム送信、バインド変数、計算またはf?p構文を使用してセッション・ステートを設定します。
セッション・ステートの設定方法
次の方法を使用して、アプリケーションのページ・アイテム値を設定することにより、セッション・ステートを設定できます。
-
フォーム送信。次の項を参照してください。
-
バインド変数。バインド変数構文を使用したセッション・ステートの参照を参照してください。
-
計算。アプリケーションの計算の理解を参照してください。
-
f?p構文。f?p構文を使用したページのリンクについてを参照してください。
フォーム送信によるセッション・ステートの設定について
ページがユーザーによって送信されると、Application Expressエンジンは、フィールド(アイテム)に入力された値をセッション・ステートに自動的に格納します。たとえば、2つのページを持つアプリケーションが存在すると想定します。このアプリケーションの最初のページには、ユーザーが電話番号を入力できるフォームが含まれています。このフォームは、P1_PHONENO
という名前のアイテムを作成して定義しています。2番目のページには、ユーザーがフォームに入力する情報を表示する必要があります。
このページが送信されると、Oracle Application Expressによって、電話番号フィールドに入力された値が取得され、今後使用するためにその値が格納されます。2番目のページで、ユーザーが入力した電話番号は、名前P1_PHONE_NO
を表3-2の適切な構文で使用して、セッション・ステートから取得できます。
アイテムによるセッション・ステートの書込み方法の制御について
アイテム属性「セッション・ステートの保持」を構成することで、ページ・アイテムがそのセッション・ステートを永続(ディスク)セッション・ステートに書き込むか、または単にメモリーに書き込むかを制御できます。使用可能なセッション・ステートの保持のオプションには、次のものが含まれます。
- リクエストごと(メモリーのみ): ステートをデータベースに保存しません。ステートを使用できるのは、現在のリクエストを処理しているときのみです。AJAX要求でアイテムを使用する必要がある場合は、「送信するページ・アイテム」属性を使用してアイテム名を必ず渡してください。
- セッションごと(ディスク): リクエストをまたがって値にアクセスできるように、各セッションの値がデータベースに保存されます。
- ユーザーごと(ディスク): ユーザー属性リポジトリに値が保存され、その後のAPEXセッションでも使用できます。
ノート:
フォーム・リージョン(ウィザードの一部など)と連動するデータベース・アイテムを作成する場合は、「リクエストごと(メモリーのみ)」がデフォルトになります。「ユーザーごと(ディスク)」は、これらのアイテムでは使用できません。親トピック: セッション・ステート値の管理
3.8.3 セッション・ステートのクリア
キャッシュされた値をクリアすると、その値がNULLにリセットされます。特定のアイテム、ページ上のすべてのアイテム、アプリケーション内のすべてのページ、または現行のユーザー・セッション用にキャッシュされた値をクリアできます。
- アイテムのキャッシュのクリアについて
- すべてのページ・アイテムのキャッシュのクリアについて
- レポート・リージョンのクリアについて
- アプリケーション全体のキャッシュのクリア
- アプリケーションの完全なリセットについて
- カレント・ユーザー・セッションのキャッシュのクリアについて
親トピック: セッション・ステート値の管理
3.8.3.1 アイテムのキャッシュのクリアについて
1つのアイテムのキャッシュをクリアすると、そのアイテムの値がNULLにリセットされます。たとえば、ページがレンダリング用に準備されるときに特定のアイテムの値を確実にNULLにしておく必要がある場合に、この方法を使用します。
例3-1 例: アイテムのキャッシュのクリア
次の例では、標準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
親トピック: セッション・ステートのクリア
3.8.3.2 すべてのページ・アイテムのキャッシュのクリアについて
アプリケーション・アイテムをキャッシュすると、セッション・ステートを効率的に保持できます。ただし、ページ上のすべてのアイテムのキャッシュをクリアする必要がある場合もあります。たとえば、ユーザーが新しい注文を作成するリンクをクリックすると、ページ上のすべてのフィールドがクリアされるようにする必要があると想定します。ページ全体のキャッシュをクリアすることで、ページ上のすべてのアイテムの値をNULLに設定できます。
例3-2 例: 2つのページのキャッシュのクリアおよびページ区切りのリセット
この例では、2つのページのセッション・キャッシュがクリアされ、ページ区切りがリセットされます。
f?p=6000:6003:&APP_SESSION.::NO:RP,6004,6014
この例では、次のようになります。
-
アプリケーション6000のページ6003が実行され、現行のセッションIDが使用されます。
-
デバッグ情報を表示しないように指示されます(
NO
)。 -
カレント・セッションのキャッシュに保持されたページ6004および6014のアイテムのすべての値がクリアされます。
-
ページ6003 (リクエストされたページ)のリージョンのページ区切り(
RP
)がリセットされます。
例3-3 例: ページのキャッシュのクリアおよびアイテム値の引渡し
この例では、更新フォームの実装方法を示します。既存の情報をクリアし、アイテムの値(通常、主キー)を設定します。
f?p=6000:6003:&APP_SESSION.::NO:6003:MY_ITEM:1234
この例では、次のようになります。
-
アプリケーション6000のページ6003が実行され、現行のセッションIDが使用されます。
-
デバッグ情報を表示しないように指示されます(
NO
)。 -
カレント・セッションのキャッシュに保持されたページ6003のアイテムのすべての値がクリアされます。
-
MY_ITEM
というアイテムのセッション・ステートの値を1234
に設定します。
例3-4 例: ページのセッション・キャッシュのクリアおよび複数のアイテムに対する値の引渡し
この例では、更新フォームの実装方法を示します。既存の情報をクリアし、アイテムの値(通常、主キー)を設定し、複数のアイテムに値を渡します。
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に設定されます。
親トピック: セッション・ステートのクリア
3.8.3.3 レポート・リージョンのクリアについて
レポート設定はキャッシュできます。レポート・タイプによって、様々な設定がキャッシュされます。次のものを使用してレポート・キャッシュ設定をクリアします。
-
RR
- 対話モード・レポート、対話グリッドまたはクラシック・レポートをリセットし、レポートのページ区切りもリセットします。ターゲット・ページに対話モード・レポートまたは対話グリッドが含まれている場合、レポートは開発者が指定した、またはユーザーが保存したデフォルトのレポート設定に戻ります。ターゲット・ページにクラシック・レポートが含まれる場合、レポート・ソートは開発者が定義したソートにリセットされます。 -
CR
- これは対話モード・レポートにのみ適用されます。CR
- 対話モード・レポートをクリアし、レポート・ページ区切りをリセットします。これにより、コントロール・ブレーク、集計、フラッシュバック、チャート、表示する行数、フィルタ、ハイライト、計算、グループ化、ピボットなどすべてのセッション・レポート設定がクリアされます。 -
RP
- 対話モード・レポートまたはクラシック・レポートのページ区切りをリセットします。
例3-5 レポート設定およびページ区切りのリセット
この例は、ターゲット・ページのレポート・リージョンのレポート設定およびページ区切りをリセットします。
f?p=6000:6003:&APP_SESSION.::NO:RR
ノート:
Oracle APEXリリース2.1以降では、レポートのリセットおよびページ区切りのリセットを行うために個別にキャッシュのクリア構文を定義する必要はありません。RR
がどちらも処理します。
親トピック: セッション・ステートのクリア
3.8.3.4 アプリケーション全体のキャッシュのクリア
この例では、f?p
構文を使用し、キーワードAPPを使用してClear Cache
引数を作成することで、アプリケーションのキャッシュがクリアされます。
f?p=App:Page:Session::NO:APP
親トピック: セッション・ステートのクリア
3.8.3.5 アプリケーションの完全なリセットについて
アプリケーション全体のキャッシュをリセットしても、アプリケーションは完全なリセット状態にはリストアされません。たとえば、アプリケーションに新しいインスタンス開始時の計算やプロセスが含まれている場合、Application Expressエンジンは、該当するアプリケーション・セッションが作成されたときに、これらの計算やプロセスを実行します。その後、キャッシュのクリア・リクエストを処理し、リクエストされたページを表示します。
(セッションIDの追跡にCookieが使用されていない場合に)セッションIDを指定せずにアプリケーションを完全にリセットするには、セッションIDを指定せずにURLを使用するか、または別のアプリケーションからAPEX_UTIL
.CLEAR_APP_CACHE
をコールして、そのアプリケーションをリクエストする必要があります。セッションIDがCookieを使用して追跡される場合、そのステートをリセットするためにログアウトする必要があります。
親トピック: セッション・ステートのクリア
3.8.3.6 カレント・ユーザー・セッションのキャッシュのクリアについて
アプリケーション・キャッシュをクリアするもう1つの方法は、キーワードSESSION
を使用してClear Cache
引数を作成することです。次に例を示します。
f?p=6000:6004:12507785108488427528::NO:SESSION
親トピック: セッション・ステートのクリア
3.8.4 バインド変数構文を使用したセッション・ステートの参照
バインド変数構文は、指定したアイテムのセッション・ステートを参照するためにSQLまたはPL/SQLを使用する場合に使用します。
親トピック: セッション・ステート値の管理
3.8.4.1 バインド変数構文の使用について
次の例では、検索文字列がページ・アイテムです。
SELECT * FROM employees WHERE last_name like '%' || :SEARCH_STRING || '%'
リージョン・タイプがSQL問合せとして定義されている場合、標準SQLバインド変数構文を使用して値を参照できます。バインド変数を使用すると、解析済のSQL問合せがデータベースによって再利用されるため、サーバーによるメモリーの使用が最適化されます。
バインド変数構文を使用する場合は、次の規則に注意してください。
-
バインド変数名は、アイテム名に対応している必要があります。
-
バインド変数名は、大/小文字が区別されません。
-
バインド変数名は、30文字以下である必要があります(有効なOracle識別子である必要があります)。
ページ・アイテム名とアプリケーション・アイテム名は255文字以下に設定できますが、アプリケーション・アイテムをバインド変数構文を使用したSQL内で使用する場合、そのアイテム名は30文字以下で指定する必要があります。
-
バインド変数のデータ型は、常に
VARCHAR2
です。バインド変数に意味的に日時または数値であるものが含まれている場合は、適切なデータ型に明示的に変換する必要があります。次に例を示します。SELECT * FROM employees WHERE start_date < to_date(:DATE_STRING, 'DD-MON-YYYY')
親トピック: バインド変数構文を使用したセッション・ステートの参照
3.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
関連項目:
リージョンについて(リージョンの作成の詳細)
親トピック: バインド変数構文を使用したセッション・ステートの参照
3.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
の値が移入されます。
親トピック: バインド変数構文を使用したセッション・ステートの参照
3.8.5 セッション・クローニングについて
セッション・クローニングを使用して、1つのOracle Application Expressアプリケーションで新しいブラウザ・ウィンドウを開き、そこで新しい個別のセッション識別子を生成して、元のApplication Expressセッションから新しいセッションにセッションの値をコピーします。
以前のリリースでは、同じOracle 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');
関連項目:
親トピック: セッション・ステート値の管理