|

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

|
بسم الله الرحمن الرحيم
كان درسا السابق (الدرس الخامس ) عن الاجراءات المخزنة
واليوم لدينا درس مشابه له وهو الوظائف المخزنة لكن الفرق ان الوظائف لابد ان تعيد
قيمة
والصسغة العامة لتكوين وظيفة كمايلي:
CREATE [OR REPLACE] FUNCTION
function_name(متغيرات الادخال الممررة ومتغيرات
الاخراج) RETURN datatype
حيث تمثل function_name اسم الوظيفة
المستخدمه.
اما OR
REPLACE فهي توضع حينما تعلم ان الاجراء موجود من السابق.
اما عن المغيرات التي بين القوسين فهي
اما متغيرات مدخله مثل اذا كان لديك اجراء حساب معدل طالب وتريد تمرير رقم الطالب
الذي تريد حساب معدله فهذه هي تعتبر كمدخلات , وهي بنفس الطريقة التي تعاملنا بها
مع الاجراءت المخزنة لاتغير على المتغيرات وطرق تعريفها.اما RETURN datatype
فهي تدل على نوع القيمة
المعادة من الوظيفة .
مثــــــــال : في الجدول الذي قمنا
بدراسته في الدرس الرابع وكان بأسم studys وكان
كمايلي :
| POINT |
MARK |
COURSE_CODE |
NO_STU |
| 13.5 |
88 |
216CS |
111 |
| 10.5 |
75 |
225CS |
222 |
| 3 |
40 |
225CS |
333 |
| 14.25 |
90 |
225CS |
111 |
| 10.5 |
78 |
216CS |
222 |
| 13.5 |
85 |
216CS |
333 |
لو اردنا تصميم وظيفة ترجع بمعدل الطالب الفصل اي يتم تمرير رقم الطالب الى
الوظيفة ثم يتم حساب المعدل الفصلي للطالب
ويتم حساب المعدل الفصل للطالب كمايلي =مجموع النقاط ÷ مجموع عدد الساعات
لمقررات
ولانشاء الوظيفة كمايلي :
|
create or replace function stu_avea(stnum in
studys.NO_STU%type) return real as hour courses.hours%type; avrage
number(4,2); sum_hours courses.hours%type:=0; point studys.POINT%type; total_Point studys.POINT%type:=0; codem courses.CODE%type; cursor sumpoint is select
COURSE_CODE,POINT from studys where NO_STU=stnum; begin open
sumpoint; loop fetch sumpoint into codem,point; exit when sumpoint%notfound; select hours into
hour from courses where code=codem; total_Point:=total_Point+point; sum_hours:=sum_hours+hour; end loop; close
sumpoint; avrage:=total_Point/sum_hours; return avrage; end; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
الشرح :
السطر رقم 1: لتعريف الوظيفة السطر
رقم 2: نوع القيمة التي سوف ترجع بها الوظيفة السطر رقم 4: تعريف متغير عدد
الساعات وهو نفس حقل عدد ساعات المقرر الموجودة في جدول courses السطر رقم 5:
تعريف متغير الذي سوف نضع به المعدل السطر رقم 6: تعريف متغير لكي يوضع به
مجموعات الساعات للطلاب في كل المواد السطر رقم 7: تعريف متغير لكي يوضع به عدد
نقاط الطلاب في اي مقرر السطر رقم 8: تعريف متغير لكي يوضع به مجموع عدد نقاط
الطالب في كل المقرر السطر رقم 9: تعريف متغير لكود المادة السطر رقم 10:
تعريف مؤشر صريح للحصول على كود المادة لكي نستفيد منه في الحصول على عدد الساعات
وعدد النقاط في ذلك المقرر لكي نضيفها الى مجموع النقاط السطر رقم 16: فتح هذا
المؤشر لكي نتعامل معه السطر رقم 17: الدخول على حلقة لكي نمر على جميع
الجدول السطر رقم 18: تحديث قيم المؤشر للسجل الحالي في المتغيرات codem,point
السطر رقم 19: شرط انهاء الحلقة وهو اذا لم يجد اي سجل في المؤشر السطر رقم
20: مؤشر ضمني لكي يقوم بالحصول على عدد ساعات الطلاب في المقرر الموجود حاليا في
المؤشر الصريح ويضع عدد الساعات في المتغير hour السطر رقم 24: اضافة عدد النقاط
للمقرر الحالي الى مجموع النقاط السابق السطر رقم 25: اضافة عدد الساعات للمقرر
الحالي الى مجموع الساعات السابق السطر رقم 26: الخروج من الحلقة السطر رقم
27: انهاء المؤشر الضمني السطر رقم 28: حساب المعدل وهو مجموع النقاط تقسيم
مجموع عدد الساعات السطر رقم 29: الرجوع بقيمة المعدل السطر رقم 30:
الانهاء
الان بعد الانتهاء من شرح طريقة تصميم الوظيفة
جاء دور طريقة الاستدعاء :
لكن قبل الاستدعاء لنحسب يدويا معدل الطالب
الذي رقمه 111 مثل لكي نقارنه بالنتائج بعد الاستعلام :
مجموع نقاط
الطالب = 13.5+14.25=
27.75
مجموع عدد الساعات
= (عدد ساعات المقرر 216CS ) + (عدد ساعات المقرر 225CS )
= 3 + 3 = 6
وبالتالي فان معدل
الطالب = 27.75 ÷ 6 = 4.63
لكن الان دعنا نستدعي الدالة ونشاهد
النتائج
SELECT distinct(NO_STU),stu_avea(no_stu) from
studys where no_stu=111;
لاحظ كيف تم استدعاء الدالة من خلال
الاستعلام ولاحظ استخدام الدالة distinct وهي لعدم تكرار السجل واليك النتائج :
NO_STU
STU_AVEA(NO_STU) ------ ;
---------------- 111
4.63
لاحظ لو كان
الاستعلام بدون وجود الدالة distinct
فسوف يتكرر
رقم الطالب عدد ظهوره في الجدول لذلك لوكان كمايلي :
SELECT
NO_STU,stu_avea(no_stu) from studys where
no_stu=111;
فان النتائج ستصبح هكذا
NO_STU
STU_AVEA(NO_STU) ------ ;
---------------- 111
4.63 111
4.63
وهذا سبب ظهور الدالة distinct
------------------------------------------------------
اتمنى لكم التوفيق
اخوكم حمد ,,,
|