السلام عليكم ورحمة الله وبركاتة
اعزاء احب ان اقدم لكم فكرة ارسال رسائل بين الـSessions وكيفية الاستفادة منها في التحكم في النظام من خلال الـDatabase
فائدة الرسائل بين الـsessions
افرض ان لديك Database Application مكون من عدد كبير من المستخدمين , وافرض ان لديك مشكلة ما في الداتابيس او انك تريد اغلاق قاعدة البيانات لسبب من الاسباب . وانك قبل ان تغلق قاعدة البيانات تريد ان اشعار جميع المستخدمين بانك سوف تعمل اغلاق لقاعدة البيانات بعد فترة محدده من الزمن .
هنا تحتاج ان ترسل رسالة لجميع المستخدمين لاشعارهم بذلك .
موضوعنا هو كيف تعمل على ارسال رسالة من قاعدة البيانات لجميع المستخدمين , وهذه الطريقه لها فوائد كثير ومثال على ذلك ما ذكر سابقاً
الخطوات
لكي نعمل على ارسال رسالة الى session معين يجب ان نستخدم الـPackage المسمى Dbms_alert ولكن هذا الـpackage هو تابع للمستخدم sys وحتى يتم استخدامة مع المستخدم scott والذي سوف نستخدمة لعمل مثال , يجب اعطا صلاحية للمستخدم scott لاستخدام الـpackage المسمى dbms_alert ويكون كالاتي
1- ادخل على المستخدم sys , كلمة السر هي change_on_install ان لم تكن قد عدلت
2-نفذ الامر
CODE
4- كون الـ Package التالي
CODE
p_msg هو IN parameter وهو عبارة عن اسم الرسالة
l_msg هو out parameter وهو يرجع محتوى الرسالة
l_state هو out parameter وهو يرجع 0 هو 1 اذا كانت القيمة 0 فان هناك رسالة حصلت
الـparameter الاخير هو قيمة رقمية تحدد عدد ثواني الانتظار لرسالة معينة (اذا كانت مثلاً 10 فان البرنامج عندما يصل الى هذه السطر سوف ينتظر 10 دقائق لكي يستقبل رسالة معين )
5- بعد ان يتم تكوين الـpackage بنجاح اذهب الى الـform builder ثم كون form بالموصفات التالية
في الـTrigger المسمىwhen-new-form-instance قم بكتابة الاتي
CODE
الاول انشاء Timer يتم من خلالة تحسس الرسائل المرسلة كل 10 ثواني
الثاني تسجيل هذا الـsession لكي يكون قادراً على استقبال الرسائل والتي سوف ترسل من Session اخر عن طريق الاجرى dbms_alert.register وكذلك يتم تحدد اسم الرسالة الي سوف يكون قادر على استقبال محتواها .
في الـTrigger المسمى WHEN-TIMER-EXPIRED اكتب الاتي
CODE
الان نفذ النموذج ولكن قبل ان تعمل على تنفيذه قم بإضافة اي item للفورم حتى ينفذ بشكل صحيح . ثم اتركا في حالة الـRUN اي لا تقم باغلاقه
6- لان اذهب الى الـsqlplus وادخل باستخدام اي مستخدم وليكن scott
7- الان نفذ الامر الاتي
CODE
8- الان اعمل commit حتى يتم ارسال الرسالة
9- اذهب الى النموذج والذي قمت بتنفيذه مسبقاً وسف تلاحظ ظهور الرسالة
ملاحظة
افرض انك تريد ان تغلق النموذج عن طريق ارسال رسالة من الـsqlplus , لعمل ذلك عدل الكود الى الاتي
CODE
CODE
ثم
اعزاء احب ان اقدم لكم فكرة ارسال رسائل بين الـSessions وكيفية الاستفادة منها في التحكم في النظام من خلال الـDatabase
فائدة الرسائل بين الـsessions
افرض ان لديك Database Application مكون من عدد كبير من المستخدمين , وافرض ان لديك مشكلة ما في الداتابيس او انك تريد اغلاق قاعدة البيانات لسبب من الاسباب . وانك قبل ان تغلق قاعدة البيانات تريد ان اشعار جميع المستخدمين بانك سوف تعمل اغلاق لقاعدة البيانات بعد فترة محدده من الزمن .
هنا تحتاج ان ترسل رسالة لجميع المستخدمين لاشعارهم بذلك .
موضوعنا هو كيف تعمل على ارسال رسالة من قاعدة البيانات لجميع المستخدمين , وهذه الطريقه لها فوائد كثير ومثال على ذلك ما ذكر سابقاً
الخطوات
لكي نعمل على ارسال رسالة الى session معين يجب ان نستخدم الـPackage المسمى Dbms_alert ولكن هذا الـpackage هو تابع للمستخدم sys وحتى يتم استخدامة مع المستخدم scott والذي سوف نستخدمة لعمل مثال , يجب اعطا صلاحية للمستخدم scott لاستخدام الـpackage المسمى dbms_alert ويكون كالاتي
1- ادخل على المستخدم sys , كلمة السر هي change_on_install ان لم تكن قد عدلت
2-نفذ الامر
CODE
Grant EXECUTE_CATALOG_ROLE to scott3- ادخل على المستخدم scott كلمة السر هي tiger ان لم تكن قد عدلت
4- كون الـ Package التالي
CODE
create or replace package msg_pkg is Function Msg(P_msg varchar2) return varchar2; end msg_pkg;CODE
create or replace package body msg_pkg is Function Msg(P_msg varchar2) return varchar2 is l_msg varchar2(2000); l_state number; Begin Dbms_alert.waitone(p_msg,l_msg,l_state,0); Return l_msg; End; end msg_pkg;هذا الـpackage سوف يستخدم لاستقبال الرسائل , حيث ان الـfunction المسمى MSG سوف ترجع الرسالة الي سوف تستقبل من بقية الـsession وهذة الرسائل سوف يتم استقبالها عن طريق Dbms_alert.waitone والذي يحوي 4 parameters
p_msg هو IN parameter وهو عبارة عن اسم الرسالة
l_msg هو out parameter وهو يرجع محتوى الرسالة
l_state هو out parameter وهو يرجع 0 هو 1 اذا كانت القيمة 0 فان هناك رسالة حصلت
الـparameter الاخير هو قيمة رقمية تحدد عدد ثواني الانتظار لرسالة معينة (اذا كانت مثلاً 10 فان البرنامج عندما يصل الى هذه السطر سوف ينتظر 10 دقائق لكي يستقبل رسالة معين )
5- بعد ان يتم تكوين الـpackage بنجاح اذهب الى الـform builder ثم كون form بالموصفات التالية
في الـTrigger المسمىwhen-new-form-instance قم بكتابة الاتي
CODE
DECLARE timer_id Timer; BEGIN timer_id := CREATE_TIMER('emp_timer', 10000, REPEAT); dbms_alert.register('my_msg'); END;وهذا الكود يستخدم لغرضين
الاول انشاء Timer يتم من خلالة تحسس الرسائل المرسلة كل 10 ثواني
الثاني تسجيل هذا الـsession لكي يكون قادراً على استقبال الرسائل والتي سوف ترسل من Session اخر عن طريق الاجرى dbms_alert.register وكذلك يتم تحدد اسم الرسالة الي سوف يكون قادر على استقبال محتواها .
في الـTrigger المسمى WHEN-TIMER-EXPIRED اكتب الاتي
CODE
Declare Is_msg Varchar2(2000); Begin Is_msg:=msg_pkg.msg('my_msg'); if is_msg is not null Then Message (is_msg); Message (is_msg); end if; End;وفي هذا الكود يتم استدعا الـPackage الذي تم انشاءه سابقاً لكي نتاكد من وجود اي رسالة , وكما هو ملاحظ من الكود فانه اذا كانت هناك رسالة سوف يتم اظهارها باستخدام الـmessage
الان نفذ النموذج ولكن قبل ان تعمل على تنفيذه قم بإضافة اي item للفورم حتى ينفذ بشكل صحيح . ثم اتركا في حالة الـRUN اي لا تقم باغلاقه
6- لان اذهب الى الـsqlplus وادخل باستخدام اي مستخدم وليكن scott
7- الان نفذ الامر الاتي
CODE
exec dbms_Alert.signal('my_msg','You must close all forms now');وهذ الامر يستخدم لوضع رسالة في الرسالة المسماة my_msg
8- الان اعمل commit حتى يتم ارسال الرسالة
9- اذهب الى النموذج والذي قمت بتنفيذه مسبقاً وسف تلاحظ ظهور الرسالة
ملاحظة
افرض انك تريد ان تغلق النموذج عن طريق ارسال رسالة من الـsqlplus , لعمل ذلك عدل الكود الى الاتي
CODE
Declare Is_msg Varchar2(2000); Begin Is_msg:=msg_pkg.msg('my_msg'); if is_msg is not null Then If Is_msg ='EXIT' Then Exit_form(no_commit); else Message (is_msg); Message (is_msg); end if; end if; End;الان اذهب الى الـsqlplus ثم ارسل الاتي
CODE
exec dbms_Alert.signal('my_msg','EXIT');
ثم
COMMIT;
تعليقات
إرسال تعليق