هذا المثال هو نفس المثال السابق ولكن هو Cursor for loop حيث تم الاستغنا عن كثير من الخطوات الموجوده في المثال السابق
-لا نحتاج الى تعريف الـ Cursor
-لا نحتاج الى فتح الـ Cursor
-لا نحتاج لى جملة الـ Fetch
- لا نحتاج لشرط الخروج من اللـ Loop .
- لا نحتاج لتعريف متغيرات
- لا نحتاج لغلق الـ Cursor
وكما هو واضح في المثال السابق يتم وضع الـ Query في جملة الـ For ويتم بعد ذلك التعامل مع السجلات
Parameter Cursor
يستخدم هذا النوع من الـ Cursor عند الحاجة للحصول على بيانات مشروطه اي عندما تريد وضع شرط في جملة الـ Select الموجوده في تعريف الـ Cursor حيث يتم فتح الـ Cursor ومن ثم تمرير قيم للمتغيرات الموجوده في الـ Cursor
كود بلغة HTML:
CODE
Declare
Cursor C1(v_dept in number) is
select empno, ename , sal from emp
where deptno=v_dept;
v_empno emp.empno%type;
v_ename emp.ename%type;
v_sal emp.sal%type;
Begin
Open C1(10);
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;
/
لو نظرنا للمثال سوف نلاحظ ان تعريف الـ Cursor اصبح يحتوي على Parameter اسمه v_dept وهذا الـ Parameter موجود في جملة الشرط where deptno=v_dept اي ان الـ Query سوف يعطينى سجلات قسم معين حسب قيمه المتغير V_dept فلو كانت قيمة الـ v_dept تساوي 10 فان الـ query سوف يعطينى سجلات القسم 10 وهكذا . وقيمة المتغير او الـ Parameter v_dept تعطى عند فتح الـ Cursor فلو نظرنا الى جملة Open c1(10) ; سوف نلاحظ ان قيمة المتغير v_dept هي 10 . ولو اردنا ان يعطينى الـ Cursor بيانات القسم 20 فكل ما علينها هو ان نغير قيمة المتغير V_dept الى 20 عند فتح الـ Cursor حيث تصبح جملة الفتح كالاتي Open c1(20) ; وهكذا .
ملاحظه :
يمكنك وضع اكثر من Parameter للـ Cursor من ثم استخدامهم كشروط لجملة الـ Select الموجوده في الـ Cursor
مثال
كود بلغة HTML:
CODE
Declare
Cursor C1(v_dept in number , s in number) is
select empno, ename , sal
from emp
where deptno=v_dept AND sal >= s;
v_empno emp.empno%type;
v_ename emp.ename%type;
v_sal emp.sal%type;
Begin
Open C1(10,3000);
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;
/
هذا المثال يحوي tow parameters الاول v_dept لتمرير قيمة القسم و الثاني S لتمرير قيمة الراتب حيث نستطيع ان نرجع بيانات موظفي قسم معين الذين رواتبهم تتجاوز قيمة معينه كما هو موضح في المثال .
Cursor for update
يستخدم هذا النوع من الـ Cursor لعمل Update في جدول الـ Cursor للسجل الموجود عليه المؤشر في متغير الـ Cursor
بمعنى اخر اذا قمت بعمل Fetch لسجل معين من الـ Cursor واردت ان تعمل Update لهذا السجل في الجدول فانك تحتاج في هذه الحالة لاستخدام الـ Cursor for update
مثال
افرض انك تريد ان تعمل update للموظف الذي راتبه اقل من 100$ لاعطاءه زياده بنسبه 5%
كود بلغة HTML:
CODE
Declare
Cursor C1 is
select empno, ename , sal
from emp for update of emp.sal;
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;
if v_sal < 1000 then
update emp set sal =v_sal + v_sal * 0.5
where current of c1;
end if;
Exit when C1%notfound;
Dbms_Output.put_line ( v_empno || ' ' || v_ename || ' ' || v_sal );
End loop;
Close C1;
End;
/
لاحظ شرط للـ update الموجود في المثال where current of c1 اي عمل update في الجدول للسجل المقابل من حيث الرقم لسجل الـ cursor الذي عملنا له Fetch .
wad_altayeb