|

|
سلسله دروس PL/SQL:الدرس
الثالث |

|
بسم الله الرحمن الرحيم
درسا في الدرس الثاني المؤشرات الصريحة والان سوف
نكمل شرح ذلك
لاحظنا في المثال السابق (اخر مثال في الدرس الثاني)
ان الاستعلام في cursor سوف يعود بسجل واحد لكن ماذا يحدث
لو اعاد المؤشر اكثر من سجل واردنا المرور على كافة السجلات ؟
لحل السؤال السابق لابد من استخدام حلقة بها شرط
وهذا هو هل سجلات المؤشر انتهت ام لا ونعرف ذلك من خلال خاصية found للمؤشر كمايلي:
mycur%found
حيث :
mycur :
هي اسم المؤشر.
% :
توضح انا مايلي اسم المؤشر هي احد
خصائصه.
found :
خاصية التي من خلالها نعرف هل تم الانتهاء
من جميع السجلات ام لا
مثال :
| النتيجة |
الدرجة |
كود المقرر |
اسم الطالب |
| RESULT |
MARK |
SUBJECT |
NO_STU |
| |
88 |
216CS |
111 |
| |
75 |
225CS |
222 |
| |
40 |
225CS |
333 |
نريد انشاء اجراء يقوم بالمرور على
الجدول وينظر الى درجة الطالب اذا كان ناجح في المقرر ام لا فاذا كان mark اكبر او يساوي 50 ضع قيمة true في حقل result والا ضع قيمة false في حقل result
نقوم اولا بانشاء هذا الجدول
:
create table stu_study( NO_STU number(4), SUBJECT varchar2(8), MARK
number(3), RESULT varchar2(20));
وبعد انشاء الجدول نقوم بادخال
المدخلات السابقة
insert into stu_study
(NO_STU,SUBJECT,MARK) values (111,'216CS',88);
insert into stu_study
(NO_STU,SUBJECT,MARK) values (222,'225CS',75);
insert into stu_study
(NO_STU,SUBJECT,MARK) values (333,'225CS',40);
بعد ذلك نقوم بانشاء
الاجراء:
declare mar
number(3); no number(3); cursor res_stu is select no_stu,mark from
stu_study; begin open res_stu; loop fetch res_stu into
no,mar; exit when res_stu%notfound; if mar>=50 then update stu_study
set result='TRUE' where no_stu=no; else update stu_study set
result='FALSE' where no_stu=no; end if; end loop; close
res_stu; end; /
وبهذا تكون النتائج في
الجدول كمايلي :
| RESULT |
MARK |
SUBJECT |
NO_STU |
| TRUE |
88 |
216CS |
111 |
| TRUE |
75 |
225CS |
222 |
| FALSE |
40 |
225CS |
333 |
هل رأيتم سهوله ذلك والفائد
الكبيرة من المؤشرات.
--------------------------------------------------------------------------
هناك طريقة اخرى لتعريف
المتغيرات لاحظ في الجدول السابق ان الحقل no_Stu تم
تعريفه على انه من نوع number وتم تعريف المتغير no في
الاجراء على انه number ايضا لكي يتم وضع رقم الطالب
فيه لكن لاحظ لو تم تغير نوع الحقل في الجدول من number
الى varchar2 فانه يجب عليك تغير نوع المتغير no في الاجراء ايضا لكن هناك طريقه تجعلك لاتعدل الاجراء كل مرة
وهي استخدام الامر التالي لتعريف المتغير no في
الاجراء
NO
stu_study.no_stu%type
حيث :
NO
هي اسم المتغير
stu_study : اسم
الجدول
no_stu : الحقل
المطلوب في الجدول
%type : خاصية نوع
الحقل
ومعنى ماسبق قم بتعريف متغير اسمه no له نفس نوعية الحقل الذي اسمه NO_STU
الموجود في الجدول stu_study .
وبهذا لان تقوم بتغير نوع العنصر في
الاجراء في كل مرة تغير النوع وهكذا مع جميع المتغيرات التي لها صله
بالجداول
وبذلك يصبح الاجراء بعد التعديل
كمايلي:
declare mar
stu_study.mark%type; no stu_study.no_stu%type; cursor res_stu is select no_stu,mark from
stu_study; begin open res_stu; loop fetch res_stu into
no,mar; exit when res_stu%notfound; if mar>=50 then update stu_study
set result='TRUE' where no_stu=no; else update stu_study set
result='FALSE' where no_stu=no; end if; end loop; close
res_stu; end; /
------------------------------------------------------------------------
وبهذا نكون انهينا المؤشرات
الصريحه
والدرس القادم سوف يكون على
المؤشرات الضمنية و الجداول مع مجموعة امثله
---------
اذا لم تفهم اي حاجة انا
بأتم الاستعداد للاجابة وشكرا لكم
اخوكم/ حمد المهندس
منتديات الفريق العربي
للبرمجة
|