|

|
سلسله دروس PL/SQL:الدرس
االتاسع (التجميعات) |

|
بسم الله الرحمن
الرحيم
انواع التجميعات في
قاعدة البيانات:
التجميعة هي مجموعة من
العناصر من نفس النوع
والتجميعات هي على
نوعين:
Ø
التجميعة varray
وهي كمصفوفة متغيرة ومشابهة للمصفوفات في
اي لغة من لغات البرمجة مثل c وc++ وتتم الاشارة الى اي عنصر في هذه
التجميعة باستخدام الارقام السفلية ويتم التخزين في هذه التجميعة بصورة خطية
inline
Ø
التجميعة nested table
تعتبر كجدول موجود في
قاعة البيانات والاشارة الى اي عنصر في هذه التجميعة ايضا باستخدام الارقام السفلية
ويتم تخزين البيانات في جدول تخزين منفصل.
--اولا :التعامل مع التجميعات في sql plus
أ -التجميعة varray من النوع البسيط
مثال/ نفرض انك تريد انشاء جدول الاقسام
في مستشفى والذي سوف يحتوي على رقم القسم , اسم القسم , واسم القسم , ومن ثم اسماء
موظفين القسم .مع العلم ان اسماء الموظفين سوف تكون في تجميعة varray.
نقوم اولا بانشاء التجميعة
كمايلي:
Create type
namev as varray(30) of varchar2(50);
/
حيث لو فرضنا ان اكبر عدد للموظفين هو
30 واكبر طول للاسم هو
50 .
ثم نقوم بأنشاء الجدول ونقوم بانشاءه
كمايلي/
Create
table deptv
(nodept
number(5) primary key,
namedept
varchar2(50),
emp
namev);
ونقوم فيمايلي بتنفيذبعض اوامر
sql على
الجدول
1-
الادراج insert :
Insert into
deptv values(10,'medical',namev('ali','sami','fahad','fady'));
2- التحديث update :
لتحديث العناصر في التجميعة يتطلب
استخدام pl/sql ولايمكن تنفيذ ذلك من خلال sql القياسية مثال:
Declare
Editname
namev;
I
number:=1;
Begin
Select emp
into editname
From deptv
where nodept=10;
Loop
If
(i=editname.count+1) then
Exit;
Elsif
(editname(i)='sami') then
Editname(i):='mohammed';
End
if;
i:=i+1;
end
loop;
update
deptv set emp=editname where nodept=10;
end;
شرح المثال السابق:
سوف يقوم بتغير اسم الموظف sami الذي قمنا بادخال وتبديلة الى
mohammed وشرح الخطوات كمايلي
اولا قمنا بتعريف متغير editname من نفس نوع التجميعة
namev وذلك لكي نقوم بتخزين المؤشر
والذي يحتوي على اسماء الموظفين فيه ونعرف ايضا متغير I وهو من يستخدم
كعداد.
ثم نقوم بعمل مؤشر لاستخراج اسماء
الموظفين وهي كمايلي
Select emp
into editname
From deptv
where nodept=10;
يقوم هنا باستخراج اسماء الموظفين للقسم
10 وتخزين ناتج الاستعلام في المتغير editname والذي هو من نفس نوع
التجميعة
ثم يبدأ حلقة ومن ثم يختبر هل
I وصلت الى نهاية
التجميعة اذا كان نعم قام بانهاء الاجراء واذا لم يصل الى نهاية التجميعة يختبر
عنصر التجميعة الحالي هل هو يساوي sami ام لا اذا كان يساوي sami يقوم بتغير هذه القيمة الى mohammed ومن ثم يزيد العداد
بواحد ومن ثم يعود من جديد الى ان يصل الى نهاية التجميعة وبعد الانتهاء من جميع
العناصر يقوم بعمل التحديث للجدول
update
deptv set emp=editname where nodept=10;
ومن ثم يقوم بانهاء
الاجراء.
2-
الحذف delete(Trim) :
حذف عنصر من التجميعة يتطلب عمل
اجراء pl/sql
والحذف في التجميعات varray يتم على اخر عنصر في التجميعة اي
لو حذفنا عنصر واحد فانه يتم على اخر عنصر ولا يمكن تحديد
العنصر
مثال:
Declare
Namedel
namev;
Begin
Select emp
into namedel
From deptv
where nodept=10;
Namedel.trim(1);
update
deptv set emp=namedel where nodept=10;
end;
/
4- التحديث بالاضافة update(append)
هذا الامر يستخدم للاضافة
ألم يتبادر الى ذهنك كيف نضيف مزيدا من
الموظفين الى القسم 10 يمكن ان تقول نستخدم الامر insert لكن هذا غير صحيح لاننا عندما
نستخدم الامر insert وندخل رقم القسم 10 يظهر لنا خطاء
لان حقل رقم القسم مفتاح رئسي
لذلك اذا اردنا اضافة المزيد من
الموظفين اولا نقوم بعمل توسع extend للتجميعة لكي تسمح لنا باضافة عنصر
جديد .ونستخدم الاجراء لذلك
ويكون الاجراء
كمايلي:
Declare
Newname namev;
Begin
Select emp into newname
From deptv where
nodept=10;
Newname.extend;
Newname(newname.last):='khaled';
update
deptv set emp=newname where nodept=10;
end;
/
----------------------------------------------------------------------------------------------------------------------------
ب - التجميعة varray من النوع الشيء:
هذه التجميعة هي تجميعة معرفة بواسطة المستخدم
مثال ذلك :
لو اردنا انشاء جدول يحتوي على مسمى الوظيفة وفي حقل
اخر نكّون تجميعة تحتوي على اسم الموظف وراتبة لجميع موظفين هذه
الوظيفة
|
EMPLOYEE |
JOB_NAME |
|
(ali,5000),(sami,6000),(fahad,4000) |
manager |
|
(laui,7500),(mohammed,7500) |
Analysis |
|
(fady,8000),(saed,6000) |
Programming |
وبالتالي فإن الخطوة الاولى هي انشاء object كمايلي
Create type
empobj
as object
(nameemp varchar2(50),salary number(6));
/
ثم نقوم بانشاء التجميعة
Create type
employeeobj as varray(20) of empobj;
/
لاحظ الفرق اننا استخدمنا object الذي انشئناه ولذلك سمي هذا النوع بهذا
الاسم
وبعد انشاء التجميعة نقوم بإنشاء الجدول
كمايلي:
Create table jobobj
(job_name
varchar2(50),
employee
employeeobj);
وبعد انشاء الجدول سوف نتعرف الان على كيفية
التعامل مع هذا الجدول من خلال sql * plus
1- الاضافة :
لاضافة صف إلى الجدول السابق نقوم
بمايلي :
Insert into
jobobj values
('manager',employeeobj (
empobj('ali',5000),
empobj('sami',6000),
empobj('fahad',4000)));
وبهذا نكون قد اضفنا الصف الاول في
الجدول السابق
ولو ذهبنا الى sql * plus وطلبنا منه مايلي
Select *
from jobobj
JOB_NAME
---------------------------------------------------
EMPLOYEEobj(NAMEEMP, SALARY(
-------------------------------------------------------------
manager
EMPLOYEE1(EMPOBJ('ali', 5000),
EMPOBJ('sami', 6000), EMPOBJ('fahad', 4000((
ونلاحظ لقد تم اضافة الصف الجديد
2- التحديث : يجب تطبيق قطعة pl/sql كمايلي:
Declare
Editname
employeeobj;
Editobj
empobj;
i
number:=1;
Begin
Select
employee into editname
From jobobj
where job_name='manager';
Loop
Editobj:=editname(i);
If
(i=editname.count) then
Exit
;
Elsif
editobj.nameemp='sami' then
Editobj.salary:=10000;
Editname(i):=editobj;
End
if;
i:=i+1;
End
loop;
Update
jobobj set employee=editname
Where
job_name='manager';
End;
وبهذا يتم تعديل راتب الموظف الذي اسمه
sami الموجود في قسم manager وجعل راتبه 10000
3- الحذف:
Declare
Editemp employeeobj;
begin
select Select
employee into editemp
From jobobj
where job_name='manager';
Editemp.trim(1);
Update
jobobj set employee=editemp
Where
job_name='manager';
وبهذا يتم حذف سجل واحد وهو اخر صف من
التجميعة
|