بتاريخ: 20 مايو 200817 سنة comment_129236 اخواني السلام كم ورحمة الله وبركاتهاريد عمل كيرسر لزيادة رواتب الموظفين بشرط اذا كان الراتب اكبر من 3000 فيتم زيادتهم ب 8% اما اذا اقل فيتم زيادتهم ب 10% على جدول ال emp في اليوزر scottوشكروفقكم الله جميعا تقديم بلاغ
بتاريخ: 20 مايو 200817 سنة comment_129282 السالم عليكم.هناك طريقتين لعمل هذا :الأولى: بإستخدام ال 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; ملحوظه: يظهر الفارق بين الطريقتين عندما يكون عدد الصفوف كبير جداً وليس في هذا المثال. الطريقه الثانيه ذكرتها للإستفاده المستقبليه وليس لهذا المثال. تقديم بلاغ
بتاريخ: 20 مايو 200817 سنة كاتب الموضوع comment_129283 باحه كل كلمات الشكر تعجز ان تعبر عن شكري وامتناني لك اخ welooooo ولكن سوف اقول لك وفقك الله وسدد وخطاك وجعلها الله في ميزان حسناتكولكن بالنسبه للطريقه الاولى فهي ناقصه ان تعرف الكيرسور على انه ريكورد مثلاemp_ec my_curs;بعد اذنك طبعا تقديم بلاغ
بتاريخ: 20 مايو 200817 سنة comment_129286 متشكر على كلامك الذوق جداً. كلامك صحيح ولكن هذا في حالة ما إذا كنت ستستخدم ال 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 من الكيرسر إليه.وفقك الله................... تقديم بلاغ
بتاريخ: 19 يونيو 200817 سنة comment_131556 اخى أحمد جزاك الله خيراً على هذا الحلولكنى ارجو منك ان تشرح الحل الثانى بتفصيل أكثروجزاك الله خيراً تقديم بلاغ
بتاريخ: 27 يونيو 200817 سنة comment_132142 السلام عليكمجزاك الله خيرا اخي الكريم الثانيه: بإستخدام ال implicit cursor وبإستخدام ال bulk collect وال forall loop (ينصح بها). الطريقة الثانية جميلة جدا ولكن اعتقد ليس اسمها implicit cursor ولكنها عباره عن جدول باستخدام الفهرس ويكون عباره عن حقلينحقل به الفهرس والثاني اي نوع تحدده انت ويطلق عليه اسم Index by tableويفضل ان يكون Index نوعه Pls_integerفعلا عامل الوقت مهم جدا جداوشكرا مرة اخرى اخي الكريم تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.