3.9 إدارة قيم حالة الجلسة #
إدارة حالة الجلسة لتخزين واسترجاع القيم للمستخدم أثناء تنقل المستخدم بين صفحات التطبيق المختلفة.
عند بناء تطبيقات ويب تفاعلية تعتمد على البيانات، تُعد القدرة على الوصول إلى قيم حالة الجلسة وإدارتها أمرًا بالغ الأهمية. في Oracle APEX ، تُدار حالة الجلسة تلقائيًا لكل صفحة، ويمكن الرجوع إليها بسهولة في عناصر تحكم HTML ثابتة أو منطقية، مثل العمليات processes أو عمليات التحقق validations.
3.9.1 حول الإشارة إلى حالة الجلسة #
قيم العناصر المرجعية المُخزّنة في حالة الجلسة في المناطق، والحسابات، والعمليات، وعمليات التحقق، والفروع. يمكن أن يكون العنصر حقلاً، أو منطقة نصية، أو كلمة مرور، أو قائمة اختيار، أو مربع اختيار.
يوضح الجدول التالي بناء الجملة المدعوم للإشارة إلى قيم العناصر.
النوع Type | بناء الجملة Syntax | الوصف |
---|---|---|
SQL | بناء الجملة القياسي للعناصر::MY_ITEM بناء الجملة للعناصر التي تحتوي على أحرف خاصة::"MY_ITEM" | بالنسبة للعناصر التي لا يتجاوز طول أسمائها 30 حرفًا، ضع علامة النقطتين (:) قبل اسم العنصر. استخدم هذا التركيب النحوي للمراجع ضمن استعلام SQL وPL/SQL. للإشارة إلى عناصر الصفحة التي تحتوي على أحرف خاصة أو متعددة البايتات أو أحرف يونيكود، قم بوضع اسم عنصر الصفحة بين علامتي اقتباس مزدوجتين. نوع بيانات متغير الربط هو نوع بيانات حالة جلسة العنصر. معظم العناصر تكون VARCHAR2 افتراضية، ولكن يمكن ضبط بعض أنواع العناصر على CLOB . |
PL/SQL | V('MY_ITEM') أو APEX_SESSION_STATE.GET_VARCHAR2('MY_ITEM') | استخدم بناء جملة PL/SQL للإشارة إلى قيمة عنصر باستخدامV دالة. يمكنك استخدام الاختصار V function بدلاً من APEX_SESSION_STATE.GET_VARCHAR2 . استخدم هذا النحو عند استخدام متغيرات Oracle APEX مباشرةً داخل كائن قاعدة بيانات Oracle، مثل وظيفة أو مشغل أو سياسة Oracle Data Redaction.نصيحة: عند استخدام V('MY_ITEM') أو apex_session_state.get_clob('MY_ITEM') ما شابه ذلك في استعلام SQL، توصي Oracle باستخدام وظيفة Fast Dual => (select v('my_item') from dual) لتحسين الأداء. |
PL/SQL | APEX_SESSION_STATE.GET_CLOB('MY_CLOB_ITEM') | تقوم هذه الوظيفة بإرجاع قيمة CLOB عنصر الصفحة.نصيحة: عند استخدام V('MY_ITEM') أو apex_session_state.get_clob('MY_ITEM') ما شابه ذلك في استعلام SQL، توصي Oracle باستخدام وظيفة Fast Dual => (select v('my_item') from dual) لتحسين الأداء. |
PL/SQL | APEX_SESSION_STATE.GET_NUMBER('MY_NUMERIC_ITEM') | تعيد هذه الدالة قيمة عنصر الصفحة بصيغة NUMBER . ويُستخدم قناع تنسيق العنصر لإجراء التحويل.نصيحة: عند استخدام V('MY_ITEM') أو apex_session_state.get_clob('MY_ITEM') ما شابه ذلك في استعلام SQL، توصي Oracle باستخدام وظيفة Fast Dual => (select v('my_item') from dual) لتحسين الأداء. |
PL/SQL | APEX_SESSION_STATE.GET_TIMESTAMP('MY_NUMERIC_ITEM') | تعيد هذه الدالة قيمة عنصر الصفحة بصيغة TIMESTAMP . ويُستخدم قناع تنسيق العنصر لإجراء التحويل.نصيحة: عند استخدام V('MY_ITEM') أو apex_session_state.get_clob('MY_ITEM') ما شابه ذلك في استعلام SQL، توصي Oracle باستخدام وظيفة Fast Dual => (select v('my_item') from dual) لتحسين الأداء. |
نص ثابت (دقيق) | بناء الجملة القياسي للعناصر:&MY_ITEM. بناء الجملة للعناصر التي تحتوي على أحرف خاصة:&"MY_ITEM". | بالنسبة للنص الثابت أو الاستبدال الدقيق، استخدم الاتفاقية &ITEM_NAME متبوعة بنقطة (.).للإشارة إلى عناصر الصفحة التي تحتوي على أحرف خاصة أو متعددة البايتات أو أحرف يونيكود، قم بوضع اسم عنصر الصفحة بين علامتي اقتباس مزدوجتين. لا يمكن استخدام عناصر الصفحة من نوع بيانات حالة الجلسة CLOB كمراجع باستخدام هذا النحو. يجب استخدام آلية إخراج مختلفة لجلب قيمها، مثل عنصر صفحة في وضع القراءة فقط، أو عنصر صفحة للعرض فقط، أو إخراجه يدويًا باستخدام منطقة محتوى ديناميكي. |
3.9.2 حول إعداد حالة الجلسة #
حدّد حالة الجلسة باستخدام عمليات إرسال النماذج، أو متغيرات الربط، أو العمليات الحسابية، أو صيغة f?p. كما يُمكن ضبط حالة الجلسة باستخدام واجهات برمجة التطبيقات APEX_SESSION_STATE.SET
APIs.
طرق تعيين حالة الجلسة #
يمكنك تعيين قيمة عنصر الصفحة في تطبيقك وبالتالي تعيين حالة الجلسة باستخدام الطرق التالية:
حول تعيين حالة الجلسة مع إرسال النموذج #
عندما يُرسل مستخدم صفحة، يُخزّن مُحرّك Oracle APEX تلقائيًا القيم المُدخلة في الحقول (العناصر) في حالة الجلسة. على سبيل المثال، لنفترض أن لديك تطبيقًا يحتوي على صفحتين. تحتوي الصفحة الأولى من التطبيق على نموذج يُمكّن المستخدم من إدخال رقم هاتف. حدّدتَ هذا النموذج بإنشاء عنصر باسم P1_PHONENO
. في الصفحة الثانية، تريد عرض المعلومات التي يُدخلها المستخدم في النموذج.
عند إرسال الصفحة، يلتقط APEX القيمة المُدخلة في حقل رقم الهاتف ويخزنها للاستخدام لاحقًا. في الصفحة الثانية، يمكن استرجاع رقم الهاتف الذي أدخله المستخدم من حالة الجلسة باستخدام الاسم P1_PHONE_NO
مع الصيغة المناسبة الموضحة في “حول الإشارة إلى حالة الجلسة”.
حول التحكم في كيفية كتابة العناصر لحالة الجلسة #
يمكنك التحكم فيما إذا كان عنصر الصفحة يكتب حالة جلسته في حالة جلسة دائمة (قرص) أو في الذاكرة فقط، وذلك بتكوين سمة العنصر، ” الحفاظ على حالة الجلسة” . تتضمن خيارات “الحفاظ على حالة الجلسة” المتاحة ما يلي:
- لكل طلب (الذاكرة فقط) Per Request (Memory Only) – لا تحفظ الحالة في قاعدة البيانات. الحالة متاحة فقط عند معالجة الطلب الحالي. عند استخدام عنصر في طلبات AJAX، تأكد من تمرير اسم العنصر باستخدام سمة “عناصر الصفحة المراد إرسالها”.
- لكل جلسة (قرص) Per Session (Disk) – الحفاظ على القيمة لكل جلسة من خلال تخزينها في قاعدة البيانات، للوصول إليها عبر الطلبات.
- لكل مستخدم (قرص) Per User (Disk) – يتم حفظ القيمة في مستودع سمات المستخدم كما أنها متاحة أيضًا لجلسات APEX اللاحقة.
ملحوظة: عند إنشاء عناصر قاعدة بيانات تعمل مع منطقة نموذج (كجزء من معالج مثلاً)، يكون “لكل طلب (الذاكرة فقط)” Per Request (Memory Only) هو الخيار الافتراضي. لا يتوفر “لكل مستخدم (قرص)” User (Disk) لهذه العناصر.
3.9.3 مسح حالة الجلسة #
يؤدي مسح قيمة مخزنة مؤقتًا إلى إعادة تعيينها إلى قيمة فارغة. يمكنك مسح القيمة المخزنة مؤقتًا لعناصر محددة، أو جميع عناصر الصفحة، أو جميع صفحات التطبيق، أو جلسة المستخدم الحالية.
3.9.3.1 حول مسح ذاكرة التخزين المؤقت لعنصر ما #
عرض أمثلة لمسح ذاكرة التخزين المؤقت لعنصر واحد.
يؤدي مسح ذاكرة التخزين المؤقت لعنصر واحد إلى إعادة تعيين قيمته إلى الصفر. على سبيل المثال، يمكنك استخدام هذه الطريقة للتأكد من أن قيمة عنصر معين فارغة عند تحضير الصفحة للعرض.
مثال 3-4: مسح ذاكرة التخزين المؤقت لعنصر #
يستخدم المثال التالي f?p
صيغةً قياسيةً لمسح ذاكرة التخزين المؤقت لعنصر. يستدعي هذا المثال الصفحة 5 من التطبيق 100. يؤدي وضع الصيغة MY_ITEM
في ClearCache
موضعها f?p
إلى إعادة تعيين قيمة 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.9.3.2 حول مسح ذاكرة التخزين المؤقت لجميع عناصر الصفحة #
عرض أمثلة لمسح ذاكرة التخزين المؤقت لجميع عناصر الصفحة.
يُعد تخزين عناصر التطبيق مؤقتًا طريقة فعّالة للحفاظ على حالة الجلسة. ومع ذلك، قد تحتاج أحيانًا إلى مسح ذاكرة التخزين المؤقت لجميع العناصر في الصفحة. على سبيل المثال، لنفترض أنك تحتاج إلى مسح جميع الحقول في صفحة ما عند نقر المستخدم على رابط يُنشئ طلبًا جديدًا. بمسح ذاكرة التخزين المؤقت لصفحة كاملة، تُعيّن قيمة جميع العناصر في الصفحة إلى قيمة فارغة.
مثال 3-5 مثال: مسح ذاكرة التخزين المؤقت لصفحتين وإعادة تعيين الترقيم #
يقوم هذا المثال بمسح ذاكرة التخزين المؤقت للجلسة لصفحتين وإعادة تعيين الترقيم الصفحي.
f?p=6000:6003:&APP_SESSION.::NO:RP,6004,6014
هذا المثال:
- يقوم بتشغيل الصفحة 6003 من التطبيق 6000 ويستخدم معرف الجلسة الحالية.
- يشير إلى عدم إظهار معلومات التصحيح (
NO
). - يقوم بمسح جميع القيم المحفوظة بواسطة ذاكرة التخزين المؤقت للجلسة الحالية للعناصر الموجودة في الصفحتين 6004 و6014.
- إعادة تعيين ترقيم الصفحات الإقليمية (
RP
) على الصفحة 6003 (الصفحة المطلوبة).
مثال 3-6 مثال: مسح ذاكرة التخزين المؤقت على صفحة وتمرير قيمة عنصر #
يوضح هذا المثال كيفية تنفيذ نموذج تحديث. يمسح هذا النموذج المعلومات الموجودة ويحدد قيمة العنصر (عادةً ما تكون مفتاحًا أساسيًا).
f?p=6000:6003:&APP_SESSION.::NO:6003:MY_ITEM:1234
هذا المثال:
- يقوم بتشغيل الصفحة 6003 من التطبيق 6000 ويستخدم معرف الجلسة الحالية
- يشير إلى عدم إظهار معلومات التصحيح (
NO
) - مسح جميع القيم المحفوظة في ذاكرة التخزين المؤقت للجلسة الحالية للعناصر الموجودة في الصفحة 6003
- تعيين حالة الجلسة للعنصر الذي تم استدعاؤه
MY_ITEM
إلى القيمة1234
مثال 3-7 مثال: مسح ذاكرة التخزين المؤقت للجلسة على صفحة وتمرير القيم إلى عناصر متعددة #
يوضح هذا المثال كيفية تنفيذ نموذج تحديث. فهو يمسح المعلومات الموجودة، ويحدد قيمة العنصر (عادةً مفتاحًا أساسيًا)، ويمرر قيمًا إلى عناصر متعددة.
f?p=6000:6004:&APP_SESSION.::NO:6003:MY_ITEM1,MY_ITEM2,MY_ITEM3:1234,,5678
هذا المثال:
- يقوم بتشغيل الصفحة 6004 من التطبيق 6000 ويستخدم معرف الجلسة الحالية
- مسح ذاكرة التخزين المؤقت للجلسة الحالية للعناصر الموجودة في الصفحة 6003
- يشير إلى عدم إظهار معلومات التصحيح (
NO
) - تعيين قيمة
MY_ITEM1
إلى 1234، وتعيين قيمةMY_ITEM2
إلى null (كما هو موضح بواسطة الفاصلة المستخدمة كعلامة نائبة)، وتعيين قيمةMY_ITEM3
إلى 5678
3.9.3.3 حول مسح مناطق التقرير #
تعرف على كيفية مسح ذاكرة التخزين المؤقت للتقرير.
يمكن تخزين إعدادات التقارير مؤقتًا. تختلف أنواع التقارير باختلاف الإعدادات. استخدم ما يلي لمسح إعدادات ذاكرة التخزين المؤقت للتقارير:
RR
– يُعيد ضبط التقارير التفاعلية، والشبكات التفاعلية، والتقارير الكلاسيكية، ويُعيد أيضًا ضبط ترقيم صفحات التقارير. إذا كانت الصفحة المستهدفة تحتوي على تقرير تفاعلي أو شبكات تفاعلية، فسيتم إرجاع التقرير إلى إعداداته الافتراضية التي حددها المطور أو حفظها المستخدم. أما إذا كانت الصفحة المستهدفة تحتوي على تقرير كلاسيكي، فسيتم إعادة ضبط فرز التقارير إلى الفرز المُحدد من قِبل المطور.CR
ينطبق هذا فقط على التقارير التفاعلية.CR
يُمسح التقرير التفاعلي ويُعيد ضبط ترقيم صفحاته. يُمسح هذا جميع إعدادات تقرير الجلسة، مثل فاصل التحكم، والتجميع، والارتجاع، والرسم البياني، وعدد الصفوف المعروضة، والتصفية، والتمييز، والحساب، والتجميع حسب، والمحور.RP
– إعادة تعيين ترقيم الصفحات في التقرير التفاعلي أو التقرير الكلاسيكي.
مثال 3-8 إعادة تعيين إعدادات التقرير والترقيم الصفحي #
يعمل هذا المثال على إعادة تعيين إعدادات التقرير وتقسيم الصفحات لمناطق تقرير الصفحة المستهدفة:
f?p=6000:6003:&APP_SESSION.::NO:RR
ملحوظة: بدءًا من إصدار Oracle APEX 2.1، لن تحتاج إلى تعريف صيغة مسح ذاكرة التخزين المؤقت المنفصلة لإعادة تعيين التقرير وإعادة تعيين الترقيم الصفحي.
RR
سيتعامل مع كليهما.
3.9.3.4 مسح ذاكرة التخزين المؤقت للتطبيق بأكمله #
عرض مثال لمسح ذاكرة التخزين المؤقت لتطبيق ما.
يقوم هذا المثال بمسح ذاكرة التخزين المؤقت للتطبيق باستخدام f?p
بناء الجملة وإنشاء Clear Cache
وسيطة باستخدام الكلمة الأساسية APP .
f?p=App:Page:Session::NO:APP
3.9.3.5 حول إعادة تعيين التطبيق بالكامل #
تعرف على كيفية إعادة تعيين التطبيق بالكامل.
إعادة تعيين ذاكرة التخزين المؤقت لتطبيق كامل لا تعيد التطبيق إلى حالة إعادة التعيين الكاملة. على سبيل المثال، إذا كان التطبيق يتضمن حسابات أو عمليات جديدة على المثيلات، فإن محرك Oracle APEX يُشغّل هذه الحسابات والعمليات عند إنشاء جلسة التطبيق. بعد ذلك، يُعالج طلب مسح ذاكرة التخزين المؤقت ويعرض الصفحة المطلوبة.
لإعادة ضبط تطبيق بالكامل بدون مُعرِّف جلسة (في حال عدم استخدام ملف تعريف ارتباط لتتبع مُعرِّف الجلسة)، يجب عليك طلب ذلك باستخدام عنوان URL بدون مُعرِّف جلسة، أو عن طريق استدعاء APEX_UTIL
. CLEAR_APP_CACHE
من تطبيق آخر. إذا تم تتبع مُعرِّف الجلسة باستخدام ملف تعريف ارتباط، فيجب عليك تسجيل الخروج لإعادة ضبط الحالة.
3.9.3.6 حول مسح ذاكرة التخزين المؤقت لجلسة المستخدم الحالية #
شاهد مثالاً لمسح ذاكرة التخزين المؤقت للتطبيق لجلسة المستخدم الحالية.
طريقة أخرى لمسح ذاكرة التخزين المؤقت للتطبيق هي إنشاء Clear Cache
وسيطة باستخدام الكلمة الأساسية SESSION
. على سبيل المثال:
f?p=6000:6004:12507785108488427528::NO:SESSION
3.9.4 الإشارة إلى حالة الجلسة باستخدام بناء جملة متغير الربط #
استخدم صيغة متغير الربط في أي مكان تستخدم فيه SQL أو PL/SQL للإشارة إلى حالة الجلسة الخاصة بعنصر محدد.
3.9.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.9.4.2 حول استخدام متغيرات الربط في المناطق استنادًا إلى استعلام SQL أو قائمة القيم #
تعرف على كيفية استخدام متغيرات الربط في المناطق المحددة كاستعلام SQL أو استعلام SQL (نص دالة plsql الذي يرجع استعلام SQL) أو قائمة القيم (LOV).
إذا تم تعريف نوع منطقتك كاستعلام SQL أو استعلام SQL (نص دالة plsql الذي يعيد استعلام SQL) أو قائمة قيم (LOV)، فيمكنك الرجوع إلى حالة الجلسة باستخدام بناء الجملة التالي:
:MY_ITEM
إحدى الطرق الشائعة للقيام بذلك هي دمج متغير حالة جلسة في WHERE
جملة. يوضح المثال التالي كيفية ربط قيمة العنصر THE_DEPTNO
بمنطقة مُعرّفة من استعلام SQL.
SELECT last_name, job_id, salary
FROM employees
WHERE department_id = :THE_DEPTNO
3.9.4.3 حول استخدام متغيرات الربط في المناطق استنادًا إلى PL/SQL #
تعرف على كيفية استخدام متغيرات الربط في المناطق استنادًا إلى 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.9.5 حول استنساخ الجلسة #
استخدم استنساخ الجلسة لفتح نافذة متصفح جديدة في تطبيق Oracle APEX واجعله ينشئ معرف جلسة مميزًا جديدًا وينسخ قيم الجلسة من جلسة APEX الأصلية إلى الجلسة الجديدة.
في الإصدارات السابقة، كان فتح نوافذ متعددة (أو علامات تبويب في المتصفح) في تطبيق APEX نفسه يؤدي إلى عدد من المشاكل. عادةً، كانت جميع علامات تبويب المتصفح تشترك في نفس الجلسة وحالة الجلسة، مما يؤدي إلى نتائج غير متوقعة وغير مرغوب فيها.
لاستخدام استنساخ الجلسة، يجب على المطور توفير طريقة للمستخدم لفتح علامة تبويب جديدة في المتصفح وتحديد قيمة REQUEST
إلى APEX_CLONE_SESSION
. فيما يلي مثال على عنوان URL:
f?p=&APP_ID.:&APP_PAGE_ID.:&APP_SESSION.:APEX_CLONE_SESSION
أفضل الممارسات عند استخدام استنساخ الجلسة #
عند استخدام استنساخ الجلسة هذه، يجب على المطورين أن يتذكروا:
- سوف يتأثر وقت الخمول المرتبط بجلسة Oracle APEX بأي من جلسات APEX ، الأصلية أو المنسوخة.
- عندما يقوم المستخدم بتسجيل الخروج من جلسة واحدة (الأصلية أو المستنسخة)، سيتم تسجيل الخروج من جميع الجلسات الأخرى المرتبطة بها.
- ستكون مدة الجلسة القصوى عبارة عن دالة لجلسة APEX الأصلية ووقت إنشائها.
- يمكن للمستخدم الإداري تمكين أو تعطيل هذه الميزة باستخدام الإجراء التالي:
apex_instance_admin.set_parameter(
p_parameter => ‘CLONE_SESSION_ENABLED’,
p_value => ‘Y’);