الانتقال إلى المحتوى

عمل كيرسو لتحديث الراتب


awn78

Recommended Posts

اخواني السلام كم ورحمة الله وبركاته

اريد عمل كيرسر لزيادة رواتب الموظفين بشرط اذا كان الراتب اكبر من 3000 فيتم زيادتهم ب 8% اما اذا اقل فيتم زيادتهم ب 10% على جدول ال emp في اليوزر scott


وشكر




وفقكم الله جميعا

رابط هذا التعليق
شارك

السالم عليكم.

هناك طريقتين لعمل هذا :
الأولى: بإستخدام ال 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;



ملحوظه: يظهر الفارق بين الطريقتين عندما يكون عدد الصفوف كبير جداً وليس في هذا المثال. الطريقه الثانيه ذكرتها للإستفاده المستقبليه وليس لهذا المثال.

رابط هذا التعليق
شارك

باحه كل كلمات الشكر تعجز ان تعبر عن شكري وامتناني لك اخ welooooo
ولكن سوف اقول لك وفقك الله وسدد وخطاك وجعلها الله في ميزان حسناتك
ولكن بالنسبه للطريقه الاولى فهي ناقصه ان تعرف الكيرسور على انه ريكورد مثلا

emp_ec my_curs;

بعد اذنك طبعا

رابط هذا التعليق
شارك

متشكر على كلامك الذوق جداً. كلامك صحيح ولكن هذا في حالة ما إذا كنت ستستخدم ال basic loop أما في حالة ال for loop فيتم تعريف الكيرسر أثناء كتابة جملة ال for loop


for i in my_curs loop


في هذا المثال فإن ال " i " هو ال variable الذي سوف يتعامل مع البيانات الموجوده في الكيرسر. لاحظ أني إستخدمت المتغير " i " في جملة التحديث :


if i.sal>3000
then
update emp
set sal=i.sal+((i.sal/100)*8)
where empno=i.empno;


عند إستخدام ال for loop فإنك غير مضطر لفتح الكيرسر وغلقه وكذلك تعريف متغير من نوع الكيرسر في جزء ال declare وعمل خطوة ال fetch من الكيرسر إليه.


وفقك الله...................
رابط هذا التعليق
شارك

  • بعد 4 أسابيع...
  • بعد 2 أسابيع...

السلام عليكم

جزاك الله خيرا اخي الكريم

الثانيه: بإستخدام ال implicit cursor وبإستخدام ال bulk collect وال forall loop (ينصح بها).

الطريقة الثانية جميلة جدا ولكن اعتقد ليس اسمها implicit cursor ولكنها عباره عن جدول باستخدام الفهرس ويكون عباره عن حقلين
حقل به الفهرس والثاني اي نوع تحدده انت ويطلق عليه اسم Index by table
ويفضل ان يكون Index نوعه Pls_integer

فعلا عامل الوقت مهم جدا جدا
وشكرا مرة اخرى اخي الكريم
رابط هذا التعليق
شارك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية