الصفحة الرئيسية

 

المنتديات

 

الدروس التعليمية

 

قسم التصاميم

 

راسلنا

دليل المواقع صندوق الألوان خدماتنا مكتبة الصوتيات مكتبة الخطاط
سجل الزوار صفحة الفريق مكتبة الجافا مكتبة الأدوات مجلة الموقع

 

   
 
دروس الفوتشوب

 

   
 
دروس الفوتشوب

 سلسله دروس 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

------------------------------------------------------

اتمنى لكم التوفيق

اخوكم حمد ,,,

1
دروس الجافا
دروس السويش دورة الأوركال
دروس لغة ال php برمجة ال C و ++C
دروس لغة ال ASP دروس اللنكس
دروس الأكسس قواعد البيانات mysql / sql
دروس ال MCSE دروس ال html
دروس الفلاش دروس الفرونت بيج
دروس الفيجوال بيسك دروس وندوز اكس بي
دروس برمجة الدلفي    
     
 

 

     

All Rights Reserved     ©     جميع الحقوق محفوظة

2003

شبكة بكسل

www.pxll.com