الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Featured Replies

بتاريخ:

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

اريد عمل كيرسر لزيادة رواتب الموظفين بشرط اذا كان الراتب اكبر من 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

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

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

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

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

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

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

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.