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

 

المنتديات

 

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

 

قسم التصاميم

 

راسلنا

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

 

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

 سلسله دروس PL/SQL:الدرس الرابع

بسم الله الرحمن الرحيم

اليوم عندنا درس جديد وتابع للمؤشرات ووهو المؤشرات الضمنية تعرفنا سابقا على فائد المؤشرات cursors ودرسنا النوع الاول منها واليوم عندنا نوع اخر وهو المؤشرات الضمنية وهي اسهل من المؤشرات الصريحه

وتوجد نقطتين هامتين عند التعامل  مع المؤشرات الضمنيه :

* يظهر المؤشر الضمني في جسم الاجراء body وليس في declare الخاص بالاجراء كمافي المؤشرات الصريحه

* لابد ان يسترجع مؤشر select الضمني سطر واحد.

والصيغة العامه للمؤشر الضمني كمايلي:

SELECT COLUM1,COLUM2,.......  INTO  VARIABLE1,VARIABLE2,.....               FROM  table_name

ومعنى هذا  قم باختيار الحقل1 و الحقل2 وضعها في المتغيرات منغير1 و متغير2 من الجدول table_name

سوف نأخذ مثال على ذلك وسوف نستخدم  الجدول الذي انشئناه سابق في الدرس الثاني عندما تعاملنا مع المؤشرات الصريحة وكان اسم الجدول stud

age name no
23 mohammed

111

22 talal 222
24 majed 333

واردنا مثلا كتابة اجراء يقوم بحساب متوسط اعمار الطلاب ( قد يقول البعض انه لايحتاج ذلك الى اجراء فمجرد استخدام جملة select نستطيع عمل ذلك انا اقول نعم هذا صحيح لكن احب استخدام الاجراء في هذا المثال لكي نرى طريقة عمل المؤشر الضمني ولكن سوف نرى بعد قليل مثال شامل  يتم فيه استخدام الموشرات الصريحه والضمنية في نفس الوقت) والان نقوم بكتابة الاجراء كمايلي :

set serveroutput on;
declare
aveage number(4,2);
begin
select avg(age)
into aveage
from stud;
DBMS_OUTPUT.PUT_LINE(aveage);
end;
/

*** مثال شامل لاستخدام الموشرات الصريحة والضمنيه في نفس الوقت :

لنفرض انه لدينا الجدولين التاليين : الجدول الاول اسمه courses (المقررات):

عدد الساعات اسم المقرر رقم المقرر
hours course_name code
3 NETWORK 216CS
3 ASSEMBLY 225CS
4 DATABASE 325CS

وقم بانشاء الجدول كمايلي:

create table courses(
code varchar2(8),
course_name varchar2(40),
hours number(3),
primary key(code));

وقم بادخال البيانات الموجود بالجدول كمايلي:

insert into courses values('216CS','NETWORK',3);                                             insert into courses values('225CS','ASSEMBLY',3);                                          insert into courses values('325CS','DATABASE',4);

ثم نقوم بتكوين الجدول الثاني وهو studys :

عدد النقاط الدرجة كود المقرر اسم الطالب
POINT MARK COURSE_CODE NO_STU
  88 216CS 111
  75 225CS 222
  40 225CS 333
  90 225CS 111
  78 216CS 222
  85 216CS 333

ويتم الانشاء كمايلي:

create table studys(
NO_STU varchar2(6),
COURSE_CODE varchar2(8),
MARK number(3),
point number(5,2),
primary key(NO_STU,COURSE_CODE));

 ويتم ادخال بالبيانات الموجودة بالجدول كمايلي:

insert into studys(NO_STU,COURSE_CODE,MARK)
values ('111','216CS',88);
insert into studys(NO_STU,COURSE_CODE,MARK)
values ('222','225CS',75);
insert into studys(NO_STU,COURSE_CODE,MARK)
values ('333','225CS',40);
insert into studys(NO_STU,COURSE_CODE,MARK)
values ('111','225CS',90);
insert into studys(NO_STU,COURSE_CODE,MARK)
values ('222','216CS',75);
insert into studys(NO_STU,COURSE_CODE,MARK)
values ('333','216CS',85);

بعد الانتهاء من انشاء وادخال البيانات المطلوب انشاء اجراء يقوم بحساب عدد النقاط لكل طالب وفي كل مادة وهو الحقل  عدد النقاط الذي لم ندخل فيه اي شيء ويجب  نعلم ان :

average MARK
5

95-100

4.75 90-94
4.5 85-89
4 80-84
3.5 75-79
3 70-74
2.5 65-69
2 60-64
1 1-59

ويتم حساب النقاط كمايلي : 

عدد النقاط في اي مقرر = معدل المادة (وليس الدرجة كمافي الجدول السابق) * عدد ساعات المقرر

مثال لحساب معدل الطالب الذي رقمه 111 في المقرر 216CS

نلاحظ من جدول studys ان الطالب قد تحصل على درجة 88  ونلاحظ ان الدرجة من الجدول السابق هي بين 85- 89 وبالتالي فإن معدل الطالب في هذا المقرر هو 4.5 (وهي الطريقة المتبعة في اغلب الجامعات) , ومن جدول courses نحصل على عدد الساعات للمقرر وبالتالي فان :

عدد النقاط = 4.5 * 3 = 13.5 وهكذا في جميع الطلاب وهذا هو المطلوب من الاجراء عمله.

وبالتالي فان الاجراء سوف يكون كمايلي:

DECLARE
no_Student studys.NO_STU%type;
hou courses.hours%type;
mark studys.mark%type;
cou_code courses.code%type;
poi studys.point%type;
cursor st_point is
select NO_STU,COURSE_CODE,MARK from studys;
BEGIN
open st_point;
loop
exit when st_point%notfound;
fetch st_point into no_Student,cou_code,mark;
select hours
into hou
from courses
where code=cou_code ;
if (mark>=95)and(mark<=100) then
poi:=5 * hou;
elsif mark>=90 then
poi:=4.75 * hou;
elsif mark>=85 then
poi:=4.5 * hou;
elsif mark>=80 then
poi:=4 * hou;
elsif mark>=75 then
poi:=3.5 * hou;
elsif mark>=70 then
poi:=3 * hou;
elsif mark>=65 then
poi:=2.5 * hou;
elsif mark>=60 then
poi:=2 * hou;
else
poi:=1 * hou;
end if;
update studys set POINT=poi
where NO_STU=no_Student and COURSE_CODE=cou_code ;
end loop;
close st_point;
end;

/

لاحظ هنا اننا استخدمنا المؤشرات الصريحة والمؤشرات الضمنيه والصريحة استخدمناه لكي تقوم بفتح سجلات الجدول studys والمؤشر الضمنلي استخدمنا لكي يعود بعدد الساعات في كل مرة يدور بالحلقة.

شرح الاجراء :

في التعريفات اتوقع انه لاتوجد هناك مشكلة لديكم , اما جسم البرنامج ابتدأً من begin فهو كمايلي :

اولا يفتح المؤشر الصريح والذي يحتوي على جميع سجلات الجدول studys ثم يكون حلقة دورانية لكي يمر على جميع سجلات الطلاب الموجودة في المؤشر الصريح وطبعا شرط الانهاء لهذه الحلقة هو الوصول الى اخر سجل . ثم يقوم بعملية تحديث سجلات الطالب الاولى في المتغيرات كمايلي:

fetch st_point into no_Student,cou_code,mark;

وطبعا المتغيرات هي رقم الطالب ورقم المقرر والدرجة في المقرر ولنفرض الان نحن الان عند السجل الاول ووهو الطالب الذي رقمه 111 ورقم المقرر 216CS ودرجته هي 88 سوف يضع هذه البيانات في المتغيرات, ثم يستخدم مؤشر ضمني لكي يحضر عدد ساعات المادة التي درسها الطالب 111 وهي 216CS و المؤشر هو

select hours
into hou
from courses
where code=cou_code ;

ومعنى هذا احضر عدد ساعات المقرر الذي رقمه هو  cou_code وهذا المتغير هو معروف من المؤشر الصريح الاول وسبب استخدامنا هذا المؤشر هو ان عدد ساعات المقرر موجودة في جدول اخر ولابد من استخدام هذا المؤشر لكي يحضر عدد الساعات. وبما اننا فرضنا اننا عند السجل الاول فسوف يحضر عدد ساعات المقرر 216CS  وهي 3 ساعات ثم بدأ يختبر الدرجة وذلك طبقا للجدول الدرجات والمعدلات حيث كانت درجة الطالب الذي رقمه 111 في المقرر 216cCS  هي 88 وبالتالي يكون عدد النقاط  كمايلي = 4.75 * 3 = 13.5 , وبعد الانتهاء من حساب المعدل يقوم  بنعديل الجدول وتحديث قيمة point بقيمتها الجديدة , وهكذا يمر على كل طالب بنفس الطريقة السابقة الى ان يصل الى نهاية السجلات.وبالتالي تكون النتائج كمايلي في الجدول 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

بعد الانتهاء من هذا المثال نكون انهينا المؤشرات بنوعيها بشكل تام وبامثله واقعيه وتوصل المعلومة بشكل سليم.

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

الـــــــــــــــــــجـــــــــداول  في pl/sql ( المصفوفات):

تستخدم هذه الجداول (المصفوفات) مثل المصفوفات في هي  لغة من لغات البرمجة مثل لو كانت لديك سلسلة من الارقام وتريد تخزينها فانك تستخدم هذه الجداول للتخزين ويتم تعريف متغير من هذا النوع كمايلي  اولا يتم تعريف هذا النوع :

TYPE   اسم_النوع IS TABLE OF نوع_المتغير INDEX BY BINARY_INTEGER

مثال على ذلك :

DECLARE
TYPE num_array IS TABLE OF number(4) INDEX BY BINARY_INTEGER;
num num_array;
BEGIN
........
........
END;

لاحظ اولا تم تعريف نوع واسماه num_array  , ثم قام بتعريف متغير num واعطاه نوع num_array   وهو النوع الجديد الذي قمنا بانشاءه.

مثال عملي /

set serveroutput on;
DECLARE
TYPE num_array IS TABLE OF number(4) INDEX BY BINARY_INTEGER;
i   number(4);
num    num_array;
BEGIN
FOR  i  IN  1..10 LOOP
num(i) := i * i ;
END LOOP;
FOR  i  IN  1..10 LOOP
DBMS_OUTPUT.PUT_LINE(i || '*' || i || '= ' || num(i) );
END LOOP;
END;
/

وويكون عمل هذا الاجراء كمايلي : الحلقة الاولى تقوم بضرب العدد i  في نفسه وتخزنه في المتغير num برتبه i وهكذا والحلقة الثانية للطباعة ويكون الناتج كمايلي :

1*1= 1
2*2= 4
3*3= 9
4*4= 16
5*5= 25
6*6= 36
7*7= 49
8*8= 64
9*9= 81
10*10= 100

--------------------------------------------------------------------------------------------------------------------                          تم بحمدالله وتوفيقة . في الدرس القادم سوف نبدأ  تكوين(انشاء) الاجراءات المخزنه وكيفيه استدعاءها وما الى ذلك

اخوكم /حمد المهندس

الفريق العربي للبرمجة.

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

 

     

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

2003

شبكة بكسل

www.pxll.com