awn78 بتاريخ: 20 مايو 2008 تقديم بلاغ مشاركة بتاريخ: 20 مايو 2008 اخواني السلام كم ورحمة الله وبركاتهاريد عمل كيرسر لزيادة رواتب الموظفين بشرط اذا كان الراتب اكبر من 3000 فيتم زيادتهم ب 8% اما اذا اقل فيتم زيادتهم ب 10% على جدول ال emp في اليوزر scottوشكروفقكم الله جميعا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
weloooo بتاريخ: 20 مايو 2008 تقديم بلاغ مشاركة بتاريخ: 20 مايو 2008 السالم عليكم.هناك طريقتين لعمل هذا :الأولى: بإستخدام ال explicit cursor ومعه ال for loop.الثانيه: بإستخدام ال implicit cursor وبإستخدام ال bulk collect وال forall loop (ينصح بها).إن الطريقه الأولى (التقليديه) تنفذ ما تريده ولا تشكل فارق كبير بينها وبين الطريقه الثانيه إذا كان عدد الصفوف التي سوف تحدثها قليله (كما في مثالك) ولكن إذا كانت عدد الصفوف كبيره جداً (مثلاً 50000 صف) فمن المستحسن إستخدام الطريقه الثانيه لأن كفاءتها أعلى ولا تأخذ وقتاً في التنفيذ مثل الأولى.أما الثانيه فتتضح فوائدها من شرح الأولى من زيادة الكفاءه حيث ان عملية الfetching تحدث مره واحده لكل الصفوف ولكن الأول تحدث مره لكل صف (تحدث 50 الف مره لكل 50 ألف صف !) . كذلك الطريقه الثانيه تستخدم ال implicit cursor والذي في أغلب الأحوال أفضل من ال explicit cursor (فعلاً !)لتلاحظ الفرق أكتب هذا الأمر : set timing on إضغط Enterالطريقه الأولى: declare cursor my_curs is select empno,sal from emp; begin for i in my_curs loop if i.sal>3000 then update emp set sal=i.sal+((i.sal/100)*8) where empno=i.empno; else update emp set sal=i.sal+((i.sal/100)*10) where empno=i.empno; end if; end loop; end; أما الطريقه الثانيه (كبيره لكنها أحسن بكثير): declare type sal_table is table of emp.sal%type index by pls_integer; type empid_table is table of emp.empno%type index by pls_integer; my_empid empid_table; my_empid2 empid_table; my_sal2 sal_table; my_sal sal_table; begin select empno,sal bulk collect into my_empid,my_sal from emp where sal>3000; select empno,sal bulk collect into my_empid2,my_sal2 from emp where sal<3000; forall indx in my_empid.first .. my_empid.last update emp set sal=sal+((sal/100)*8) where empno=my_empid(indx); forall indx in my_empid2.first .. my_empid2.last update emp set sal=sal+((sal/100)*10) where empno=my_empid2(indx); end; ملحوظه: يظهر الفارق بين الطريقتين عندما يكون عدد الصفوف كبير جداً وليس في هذا المثال. الطريقه الثانيه ذكرتها للإستفاده المستقبليه وليس لهذا المثال. اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
awn78 بتاريخ: 20 مايو 2008 كاتب الموضوع تقديم بلاغ مشاركة بتاريخ: 20 مايو 2008 باحه كل كلمات الشكر تعجز ان تعبر عن شكري وامتناني لك اخ welooooo ولكن سوف اقول لك وفقك الله وسدد وخطاك وجعلها الله في ميزان حسناتكولكن بالنسبه للطريقه الاولى فهي ناقصه ان تعرف الكيرسور على انه ريكورد مثلاemp_ec my_curs;بعد اذنك طبعا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
weloooo بتاريخ: 20 مايو 2008 تقديم بلاغ مشاركة بتاريخ: 20 مايو 2008 متشكر على كلامك الذوق جداً. كلامك صحيح ولكن هذا في حالة ما إذا كنت ستستخدم ال basic loop أما في حالة ال for loop فيتم تعريف الكيرسر أثناء كتابة جملة ال for loop for i in my_curs loop في هذا المثال فإن ال " i " هو ال variable الذي سوف يتعامل مع البيانات الموجوده في الكيرسر. لاحظ أني إستخدمت المتغير " i " في جملة التحديث :if i.sal>3000thenupdate empset sal=i.sal+((i.sal/100)*8)where empno=i.empno; عند إستخدام ال for loop فإنك غير مضطر لفتح الكيرسر وغلقه وكذلك تعريف متغير من نوع الكيرسر في جزء ال declare وعمل خطوة ال fetch من الكيرسر إليه.وفقك الله................... اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Slamonty بتاريخ: 23 مايو 2008 تقديم بلاغ مشاركة بتاريخ: 23 مايو 2008 جزاك الله كل الخير ايها الاخ الكريم احمد يحيي اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
hossam160 بتاريخ: 19 يونيو 2008 تقديم بلاغ مشاركة بتاريخ: 19 يونيو 2008 اخى أحمد جزاك الله خيراً على هذا الحلولكنى ارجو منك ان تشرح الحل الثانى بتفصيل أكثروجزاك الله خيراً اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
mostafa_fa بتاريخ: 27 يونيو 2008 تقديم بلاغ مشاركة بتاريخ: 27 يونيو 2008 السلام عليكمجزاك الله خيرا اخي الكريم الثانيه: بإستخدام ال implicit cursor وبإستخدام ال bulk collect وال forall loop (ينصح بها). الطريقة الثانية جميلة جدا ولكن اعتقد ليس اسمها implicit cursor ولكنها عباره عن جدول باستخدام الفهرس ويكون عباره عن حقلينحقل به الفهرس والثاني اي نوع تحدده انت ويطلق عليه اسم Index by tableويفضل ان يكون Index نوعه Pls_integerفعلا عامل الوقت مهم جدا جداوشكرا مرة اخرى اخي الكريم اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.