SAFWA بتاريخ: 19 فبراير 2005 تقديم بلاغ مشاركة بتاريخ: 19 فبراير 2005 (معدل) بسم الله الرحمن الرحيم المواضيع التي سوف نقوم بتقديمها:----------------------------------1-Cursor ما هو , كيف يستفاد منه , لماذا نحتاج له , انواعه مع الامثله 2- pl/sql table datatype , record datatype , Object type كيفيه تعريفها والتعامل معها مع الامثله3- Error handling لماذا نحتاج الى معالجة الاخطى 4-Subprograms فائدت ال suprograms وانواعها وكيفية انشائها مع الامثله5- packages فائدتها وكيفية انشائها مع الامثله6-Database triggers فائدتها وكيفية انشائها مع الامثلهما هو الـ Cursor :-------------------الـ Cursor هو موقع في الذاكره {Memory buffer }يقوم بحفظ البيانات الناتجه من الاستعلام بصوره مؤقته ومن ثم يتم التعامل مع هذه البيانات من الذاكره , فانت حين تقوم بكتابه اي استعلام (Select empno, ename , sal from emp) فان اوراكل يقوم بحجز منطقه في الذاكره (Cursor) ويضع البيانات الناتجه من الاستعلام فيها ومن ثم يتم التعامل مع هذه البيانات من الذاكره .انواع الـ Cursor -----------------هناك نوعين من الـ Cursors 1- implicit Cursor وهذا النوع يعرف مباشرة دون ان نقوم نحن بتعريفه فهو يعرف مباشره عندما نقوم بتنفيذ اي استعلام حيث يتم حجز منقطه في الذاكره تحت تسميه معينه وتوضع فيها كل البيانات الناتجه من الاستعلام ثم يتم عرضها في الشاشه او التقرير .فعندما تقوم بفتح ال Sql * plus ثم تقوم بكتابه الاستعلام الاتي (select empno, ename , sal from emp ) فانه يتم تعريف Cursor ضمني توضع فيه كل السجلات الناتجه من الاستعلام ثم يتم بعد ذلك عرض السجلات سجل سجل باستخدام الـIndex .2- Explicit Cursor وهذا النوع يتم تعريفه من قبل المستخدم عندما يحتاج الى التعامل مع اكثر من سجل . وهذا النوع سوف نتطرق لشرحه بصوره مفصله عندما نحتاج للتعامل مع اكثر من سجل من البيانات من داخل برنامج PL/SQL .لماذا نحتاج للـ Cursor----------------------كما هو معروف للجميع ان استخدام الـ Select في الـ PL/SQL هو لغرض معالجة البيانات وليس لعرضها وحتى نستطيع ان نعالج البيانات يجب علينا حفظها في متغيرات ومن ثم معالجتها .ومن هنا فان استخدام الـ Select في الـ PL/SQL مقيده بشرطين . الاول : ان اي جمله Select يجب ان ترجع سجل واحد فقط لانها اذا رجعت اكثر من سجل او لم ترجع اي سجل فان البرنامج سوف ينتج عنه خطى .الثاني : ان اي عمود في جمله الـ Select يجب ان يخزن قيمته في متغير مشابه له في النوع والحجم .وخلاصه الكلام ان استخدام الـ select في الـ PL/SQL محدوده بارجاع سجل واحد فقط .وهنا تاتي الحاجه للـ Cursor لان من خلال الـ Cursor نستطيع التعامل مع اكثر من سجل من داخل برنامج الـ PL/SQL . مثال : افرض انك تريد تعديل رواتب الموظفين بنسب معينه حسب سنوات الخدمه سنه او اقل الزياده 5%سنه الى سنتين الزياده 10%اكثر من سنتين الزياده 15%في هذا المثال نحتاج الى معالجه اكثر من سجل وليس سجل واحد وحتى نستطيع انجاز هذا المثال نحتاج الى Explicit Cursor نوضع فيه كل بيانات الجدول Emp ومن ثم المرور عليها سجل سجل وزياده الراتب حسب سنوات الخبره .الخطوات اللازمة لانشاء الـ Cursor -------------------------------------1- تعرف الـ Cursor وتتم في الـ Decleration part من برنامج الـ PL/SQLCODE Cursor c1 is Select empno, ename , sal from emp ;وفي هذا الخطوه يتم حجز منطقة في الذاكره للـ Cursor ومواصفات هذه المنطقه اي عدد المواقع وانواعها التي يتم حجزها في الذاكره يعتمد على نوع وعدد الاعمدة المعرففي الـ Query الموجود في تعريف الـ Cursor .في المثال السابق سوف يتم حجز منطقه في الذاكره باسم C1 تتكون من ثلاثه مواقع 2- فتح الـ Cursor وتتم في الـ Execution part من برنامج الPL/SQL CODE Open C1; وفي هذه المنطقه يتم تنفيذ الـ Query الموجود بداخل الـ Cursor ثم يتم جلب السجلات من الـ Table ووضعها في الذاكره حتى يتسنى لنا التعامل معها سجل سجل3- جلب البيانات من الذاكره ووضعها في متغيرات CODE Fetch C1 into v_empno,v_ename , v_sal وفي هذه الخطوه يتم جلب البيانات من الذاكره ووضعها في متغيرات و في كل مره يتم تنفيذ هذا الامر يتم جلب سجل واحد من مجموعة السجلات الموجوده في الـ Cursor ووضع بياناته في المتغيرات المناسبه الى ان تنتهي السجلات. ملاحظات :- قبل القيام بهذه الخطوه يجب ان تقوم بتعريف متغيرات في قسم الـ Decleration وهذه المتغيرات يجب ان تكون من نفس نوع وطول الاعمدة كالاتي :-CODE Declarev_empno emp.empno%typev_ename emp.ename%typev_sal emp.sal%type - عند وضع المتغيرات في جملة الـ Fetch يجب ان تكون مرتبه حسب ترتيب الاعمدة في جملة Select الموجوده في الـ Cursor حتى توضع البيانات المناسبه في المتغير المناسبه .- عند تنفيذ جملة Fetch اول مره يتم جلب بيانات السجل الاول ووضعه في المتغيرات . وعند تنفيذها مرة ثانية يتم جلب بيانات السجل الثاني ووضعه في المتغيرات وهكذا تستمر العملية الى يتم الانتها من كل السجلات. وهذه العملية تتم باستخدام ما يسمى بالـ Pointer فهو مؤشر يكون عند السجل الاول وينتقل الى السجل التالي في كل مرة تتم فيها عملة Fetch الى ان تنتهي السجلات .- لكي نقوم بعملية جلب لكل البيانات يجب وضع جملة الـ Fetch في Loop ينتهي عند الوصول الى اخر سجل ويتم التأكد من اننا وصلنا الى اخر سجل باستخدام الـ Attribute %notfound4- غلق الـ Cursor وفي هذه العملية يتم غلق الـ Cursor ويتم ارجاع المؤشر الى السجل الاول .Close C1;مثال :CODE Declare Cursor C1 isselect empno, ename , sal from emp;v_empno emp.empno%type;v_ename emp.ename%type;v_sal emp.sal%type;BeginOpen C1;Dbms_Output.put_line ('empno ' || ' ename ' || ' salary ');Loop Fetch C1 into v_empno, v_ename , v_sal;Exit when C1%notfound;Dbms_Output.put_line ( v_empno || ' ' || v_ename || ' ' || v_sal );End loop;Close C1;End;/لو نظرنا الى المثال السابق سوف نلاحظ ان جملة الـ Fetch موجوده داخل Loop وشرط الخروج من الـ Loop هو Exit when C1%notfound وهذا الشرط سوف يؤدي الى الخروج من اللـ Loop عندما يتم الانتهاء من السجلات . Notfound هي boolean attribute يكون True عندما يصل المؤشر الى اخر سجل . لانه اذا وصل المؤشر الى اخر سجل وقمت بعملية Fetch اخر فان البرنامج سوف يعطيك error لان المؤشر سوف يخرج من اطار تعريف الـ Cursor في الذاكره . وهناك عدد من الـ Attributes للـ Cursor كالاتي -notfound : قيمه منطقية تكون False عندما كون المؤشرضمن سجلات الـ Cursor اي لم يصل الى السجل الاخير وتكون True عندما يصل المؤشر الى اخر سجل في الـ Cursor .-Found : عكس الـ Notfound .-rowcount : قيمة رقمية وتتغير قيمتها حسب موقع المؤشر في سجلات الـ Cursor , اذا كان المؤشر في السجل الأول سوف تكون قيمة الـ Rowcount=1واذا كان المؤشر في السجل الثاني سوف تكون قيمة الـ Rowcount =2 وهكذا , وهذا يفيد في التحكم في عدد السجلات المراد عرضها . فمثلاً في المثال السابق اذا اردنا عرض 5 سجلات فقط يغير شرط الخروج من الـ Loop الى الاتي Exit when C1%rowcount=5-isopen قيمة منطقية تكون False اذا كان الـ Cursor مغلق وتكون True اذا كان الـ Cursor مفتوح وهذه الخاصية يستفاد منها عندما يتم استخدام الـ Cursor اكثر من مره في البرنامج بحيث يتم التأكد من الـ Cursor قبل فتحه لانه اذا تم فتح الـ Cursor وهو لم يغلق بعد فسوف يعطينا error .هذه الطريق الاعتيادية او التقليدية للتعامل مع الـ Cursor وهناك طريقه اسهل للتعامل مع الـ Cursor وهي الـ For loop cursor .الـ Cursor For loop:مثال :CODE declare beginDbms_Output.put_line ('empno ' || ' ename ' || ' salary ');For i in (select empno, ename , sal from emp )loopDbms_Output.put_line ( i.empno || ' ' || i.ename || ' ' || i.sal );end loop;end;/to be contunio [/align] [/align] تم تعديل 19 فبراير 2005 بواسطة SAFWA 3 اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Osama Soliman بتاريخ: 19 فبراير 2005 تقديم بلاغ مشاركة بتاريخ: 19 فبراير 2005 مشاركة جميلة جميلة جميلة وبداية طيبة اخ SAFWAبارك الله فيكونفع بك المنتدى اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mr.mostafa بتاريخ: 21 فبراير 2005 تقديم بلاغ مشاركة بتاريخ: 21 فبراير 2005 الله ينور عليك مشاركة جميلة جميلة جميلة وبداية طيبة اخ SAFWAمشكور أخى SAFWA اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
حمد محمد أحمد بتاريخ: 21 فبراير 2005 تقديم بلاغ مشاركة بتاريخ: 21 فبراير 2005 مشاركة جميلة جميلة جميلة وبداية طيبة اخ SAFWAبارك الله فيكونفع بك المنتدى جـــــــــــــــــــاززززززززززززاك الله خيراSAFWAأخوك حمد اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
ناجي بتاريخ: 26 فبراير 2005 تقديم بلاغ مشاركة بتاريخ: 26 فبراير 2005 جزاك الله عنا كل خير اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
شرين بتاريخ: 3 مارس 2005 تقديم بلاغ مشاركة بتاريخ: 3 مارس 2005 الف شكرrolleyes:حقيقى مشاركة هايلة منك وننتظر منك المزيد باذن الله ربنا يجعلة فى ميزان حسناتك ويجزيك عنا الف خير : اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
koi بتاريخ: 9 مارس 2005 تقديم بلاغ مشاركة بتاريخ: 9 مارس 2005 مشكور على اهتمامك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
musicbox_101 بتاريخ: 17 أكتوبر 2011 تقديم بلاغ مشاركة بتاريخ: 17 أكتوبر 2011 موضوع رائع وافادني كثيرا ووفر علي الكثير من الوقتمشكور جدا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
my hero is me بتاريخ: 14 ديسمبر 2011 تقديم بلاغ مشاركة بتاريخ: 14 ديسمبر 2011 موضوع رائع وافادني كثيرا ووفر علي الكثير من الوقتمشكور جدا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
faisal elzaeem بتاريخ: 28 يوليو 2012 تقديم بلاغ مشاركة بتاريخ: 28 يوليو 2012 موضوع رائع وافادني كثيرا ووفر علي الكثير من الوقتمشكور جدا ماشاء الله علي الشرح والله مافهمت الكيرسر بطريقة واضحة الا منك ربنا يجعلو في ميزان حسناتك اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Alrawdal Preschool بتاريخ: 7 مايو 2017 تقديم بلاغ مشاركة بتاريخ: 7 مايو 2017 بسم الله الرحمن الرحيم المواضيع التي سوف نقوم بتقديمها: ---------------------------------- 1-Cursor ما هو , كيف يستفاد منه , لماذا نحتاج له , انواعه مع الامثله 2- pl/sql table datatype , record datatype , Object type كيفيه تعريفها والتعامل معها مع الامثله 3- Error handling لماذا نحتاج الى معالجة الاخطى 4-Subprograms فائدت ال suprograms وانواعها وكيفية انشائها مع الامثله 5- packages فائدتها وكيفية انشائها مع الامثله 6-Database triggers فائدتها وكيفية انشائها مع الامثله ما هو الـ Cursor : ------------------- الـ Cursor هو موقع في الذاكره {Memory buffer }يقوم بحفظ البيانات الناتجه من الاستعلام بصوره مؤقته ومن ثم يتم التعامل مع هذه البيانات من الذاكره , فانت حين تقوم بكتابه اي استعلام (Select empno, ename , sal from emp) فان اوراكل يقوم بحجز منطقه في الذاكره (Cursor) ويضع البيانات الناتجه من الاستعلام فيها ومن ثم يتم التعامل مع هذه البيانات من الذاكره . انواع الـ Cursor ----------------- هناك نوعين من الـ Cursors 1- implicit Cursor وهذا النوع يعرف مباشرة دون ان نقوم نحن بتعريفه فهو يعرف مباشره عندما نقوم بتنفيذ اي استعلام حيث يتم حجز منقطه في الذاكره تحت تسميه معينه وتوضع فيها كل البيانات الناتجه من الاستعلام ثم يتم عرضها في الشاشه او التقرير . فعندما تقوم بفتح ال Sql * plus ثم تقوم بكتابه الاستعلام الاتي (select empno, ename , sal from emp ) فانه يتم تعريف Cursor ضمني توضع فيه كل السجلات الناتجه من الاستعلام ثم يتم بعد ذلك عرض السجلات سجل سجل باستخدام الـIndex . 2- Explicit Cursor وهذا النوع يتم تعريفه من قبل المستخدم عندما يحتاج الى التعامل مع اكثر من سجل . وهذا النوع سوف نتطرق لشرحه بصوره مفصله عندما نحتاج للتعامل مع اكثر من سجل من البيانات من داخل برنامج PL/SQL . لماذا نحتاج للـ Cursor ---------------------- كما هو معروف للجميع ان استخدام الـ Select في الـ PL/SQL هو لغرض معالجة البيانات وليس لعرضها وحتى نستطيع ان نعالج البيانات يجب علينا حفظها في متغيرات ومن ثم معالجتها . ومن هنا فان استخدام الـ Select في الـ PL/SQL مقيده بشرطين . الاول : ان اي جمله Select يجب ان ترجع سجل واحد فقط لانها اذا رجعت اكثر من سجل او لم ترجع اي سجل فان البرنامج سوف ينتج عنه خطى . الثاني : ان اي عمود في جمله الـ Select يجب ان يخزن قيمته في متغير مشابه له في النوع والحجم . وخلاصه الكلام ان استخدام الـ select في الـ PL/SQL محدوده بارجاع سجل واحد فقط . وهنا تاتي الحاجه للـ Cursor لان من خلال الـ Cursor نستطيع التعامل مع اكثر من سجل من داخل برنامج الـ PL/SQL . مثال : افرض انك تريد تعديل رواتب الموظفين بنسب معينه حسب سنوات الخدمه سنه او اقل الزياده 5% سنه الى سنتين الزياده 10% اكثر من سنتين الزياده 15% في هذا المثال نحتاج الى معالجه اكثر من سجل وليس سجل واحد وحتى نستطيع انجاز هذا المثال نحتاج الى Explicit Cursor نوضع فيه كل بيانات الجدول Emp ومن ثم المرور عليها سجل سجل وزياده الراتب حسب سنوات الخبره . الخطوات اللازمة لانشاء الـ Cursor ------------------------------------- 1- تعرف الـ Cursor وتتم في الـ Decleration part من برنامج الـ PL/SQL CODE Cursor c1 is Select empno, ename , sal from emp ; وفي هذا الخطوه يتم حجز منطقة في الذاكره للـ Cursor ومواصفات هذه المنطقه اي عدد المواقع وانواعها التي يتم حجزها في الذاكره يعتمد على نوع وعدد الاعمدة المعرف في الـ Query الموجود في تعريف الـ Cursor . في المثال السابق سوف يتم حجز منطقه في الذاكره باسم C1 تتكون من ثلاثه مواقع 2- فتح الـ Cursor وتتم في الـ Execution part من برنامج الPL/SQL CODE Open C1; وفي هذه المنطقه يتم تنفيذ الـ Query الموجود بداخل الـ Cursor ثم يتم جلب السجلات من الـ Table ووضعها في الذاكره حتى يتسنى لنا التعامل معها سجل سجل 3- جلب البيانات من الذاكره ووضعها في متغيرات CODE Fetch C1 into v_empno,v_ename , v_sal وفي هذه الخطوه يتم جلب البيانات من الذاكره ووضعها في متغيرات و في كل مره يتم تنفيذ هذا الامر يتم جلب سجل واحد من مجموعة السجلات الموجوده في الـ Cursor ووضع بياناته في المتغيرات المناسبه الى ان تنتهي السجلات. ملاحظات : - قبل القيام بهذه الخطوه يجب ان تقوم بتعريف متغيرات في قسم الـ Decleration وهذه المتغيرات يجب ان تكون من نفس نوع وطول الاعمدة كالاتي :- CODE Declare v_empno emp.empno%type v_ename emp.ename%type v_sal emp.sal%type - عند وضع المتغيرات في جملة الـ Fetch يجب ان تكون مرتبه حسب ترتيب الاعمدة في جملة Select الموجوده في الـ Cursor حتى توضع البيانات المناسبه في المتغير المناسبه . - عند تنفيذ جملة Fetch اول مره يتم جلب بيانات السجل الاول ووضعه في المتغيرات . وعند تنفيذها مرة ثانية يتم جلب بيانات السجل الثاني ووضعه في المتغيرات وهكذا تستمر العملية الى يتم الانتها من كل السجلات. وهذه العملية تتم باستخدام ما يسمى بالـ Pointer فهو مؤشر يكون عند السجل الاول وينتقل الى السجل التالي في كل مرة تتم فيها عملة Fetch الى ان تنتهي السجلات . - لكي نقوم بعملية جلب لكل البيانات يجب وضع جملة الـ Fetch في Loop ينتهي عند الوصول الى اخر سجل ويتم التأكد من اننا وصلنا الى اخر سجل باستخدام الـ Attribute %notfound 4- غلق الـ Cursor وفي هذه العملية يتم غلق الـ Cursor ويتم ارجاع المؤشر الى السجل الاول . Close C1; مثال : CODE Declare Cursor C1 is select empno, ename , sal from emp; v_empno emp.empno%type; v_ename emp.ename%type; v_sal emp.sal%type; Begin Open C1; Dbms_Output.put_line ('empno ' || ' ename ' || ' salary '); Loop Fetch C1 into v_empno, v_ename , v_sal; Exit when C1%notfound; Dbms_Output.put_line ( v_empno || ' ' || v_ename || ' ' || v_sal ); End loop; Close C1; End; / لو نظرنا الى المثال السابق سوف نلاحظ ان جملة الـ Fetch موجوده داخل Loop وشرط الخروج من الـ Loop هو Exit when C1%notfound وهذا الشرط سوف يؤدي الى الخروج من اللـ Loop عندما يتم الانتهاء من السجلات . Notfound هي boolean attribute يكون True عندما يصل المؤشر الى اخر سجل . لانه اذا وصل المؤشر الى اخر سجل وقمت بعملية Fetch اخر فان البرنامج سوف يعطيك error لان المؤشر سوف يخرج من اطار تعريف الـ Cursor في الذاكره . وهناك عدد من الـ Attributes للـ Cursor كالاتي -notfound : قيمه منطقية تكون False عندما كون المؤشرضمن سجلات الـ Cursor اي لم يصل الى السجل الاخير وتكون True عندما يصل المؤشر الى اخر سجل في الـ Cursor . -Found : عكس الـ Notfound . -rowcount : قيمة رقمية وتتغير قيمتها حسب موقع المؤشر في سجلات الـ Cursor , اذا كان المؤشر في السجل الأول سوف تكون قيمة الـ Rowcount=1 واذا كان المؤشر في السجل الثاني سوف تكون قيمة الـ Rowcount =2 وهكذا , وهذا يفيد في التحكم في عدد السجلات المراد عرضها . فمثلاً في المثال السابق اذا اردنا عرض 5 سجلات فقط يغير شرط الخروج من الـ Loop الى الاتي Exit when C1%rowcount=5 -isopen قيمة منطقية تكون False اذا كان الـ Cursor مغلق وتكون True اذا كان الـ Cursor مفتوح وهذه الخاصية يستفاد منها عندما يتم استخدام الـ Cursor اكثر من مره في البرنامج بحيث يتم التأكد من الـ Cursor قبل فتحه لانه اذا تم فتح الـ Cursor وهو لم يغلق بعد فسوف يعطينا error . هذه الطريق الاعتيادية او التقليدية للتعامل مع الـ Cursor وهناك طريقه اسهل للتعامل مع الـ Cursor وهي الـ For loop cursor . الـ Cursor For loop: مثال : CODE declare begin Dbms_Output.put_line ('empno ' || ' ename ' || ' salary '); For i in (select empno, ename , sal from emp ) loop Dbms_Output.put_line ( i.empno || ' ' || i.ename || ' ' || i.sal ); end loop; end; / to be contunio [/align] [/align] اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Alrawdal Preschool بتاريخ: 7 مايو 2017 تقديم بلاغ مشاركة بتاريخ: 7 مايو 2017 جزاكم الله خيرا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.