|
 |
سلسله دروس 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
--------------------------------------------------------------------------------------------------------------------
تم بحمدالله وتوفيقة . في الدرس القادم سوف نبدأ تكوين(انشاء) الاجراءات
المخزنه وكيفيه استدعاءها وما الى ذلك
اخوكم /حمد المهندس
الفريق العربي للبرمجة.
|