|

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

|
تابع للدرس التاسع
ج- التجميعة
NESTED TABLE من النوع البسيط:
تعتبر هذه التجميعة نفس
التجميعة varray من النوع
البسيط والتي نقوم بتعريفها بواسطة احد انواع البيانات الموجودة مثل
number و
varchar2 وسوف
نستخدم هنا نفس المثال الذي استخدمناه في التجميعة varray من النوع
الشيئ .
مثال/ نفرض انك تريد
انشاء جدول الاقسام في مستشفى والذي سوف يحتوي على رقم القسم , اسم القسم , واسم
القسم , ومن ثم اسماء موظفين القسم .مع العلم ان اسماء الموظفين سوف تكون في تجميعة nested table
اولا نقوم بانشاء
التجميعة وتكون كمايلي:
Create type namenested
as table of varchar2(50);
/
ثم نقوم بأنشاء الجدول
كمايلي:
Create table deptnested
(nodept number(5)
primary key,
namedept varchar2(50),
emp namenested)
nested table
emp store as
nestedtablesimple;
لاحظ السطر الاخير الذي
تم اضافنته
فيجب دائم وضعه اذا
استخدمنا nested table مع تغير المكتوب
باللون الاحمر والذي يمثل اسم الحقل الذي هو من النوع nested table.
والذي تحته خط يعتبر
كأسم لهذا nested table
**التعامل مع الجدول
السابق من خلال اوامر sql
1- الاضافة :
Insert into deptnested
values(1,'medical',namenested('ali','sami','fahad','fady'));
2- التحديث update
:
لتحديث العناصر في
التجميعة يتطلب استخدام pl/sql ولايمكن
تنفيذ ذلك من خلال sql القياسية مثال:
Declare
Editname
namenested;
I
number:=1;
Begin
Select emp into
editname
From deptnested where
nodept=1;
Loop
If (i=editname.count+1)
then
Exit;
Elsif
(editname(i)='sami') then
Editname(i):='mohammed';
End if;
i:=i+1;
end loop;
update deptnested set
emp=editname where nodept=1;
end;
/
شرح المثال السابق:
سوف يقوم بتغير اسم
الموظف sami الذي قمنا
بادخال وتبديلة الى mohammed وشرح
الخطوات كمايلي
اولا قمنا بتعريف متغير
editname من نفس نوع
التجميعة namenested وذلك لكي
نقوم بتخزين المؤشر والذي يحتوي على اسماء الموظفين فيه ونعرف ايضا متغير
I وهو
يستخدم كعداد.
ثم نقوم بعمل مؤشر
لاستخراج اسماء الموظفين وهي كمايلي
Select emp into
editname
From deptnested where
nodept=1;
يقوم هنا باستخراج
اسماء الموظفين للقسم 1 وتخزين ناتج الاستعلام في المتغير editname والذي هو
من نفس نوع التجميعة
ثم يبدأ حلقة ومن ثم
يختبر هل I وصلت الى
نهاية التجميعة اذا كان نعم قام بانهاء الاجراء واذا لم يصل الى نهاية التجميعة
يختبر عنصر التجميعة الحالي هل هو يساوي sami ام لا اذا
كان يساوي sami يقوم بتغير
هذه القيمة الى mohammed ومن ثم
يزيد العداد بواحد ومن ثم يعود من جديد الى ان يصل الى نهاية التجميعة وبعد
الانتهاء من جميع العناصر يقوم بعمل التحديث للجدول
update deptnested set
emp=editname where nodept=1;
ومن ثم يقوم بانهاء
الاجراء.
3- التحديث بالاضافة
update(append)
:
اذا اردنا اضافة المزيد
من الموظفين اولا نقوم بعمل توسع extend للتجميعة لكي تسمح لنا
باضافة عنصر جديد .ونستخدم الاجراء لذلك
ويكون الاجراء كمايلي:
Declare
Newname namenested;
Begin
Select emp into newname
From deptnested where
nodept=1;
Newname.extend;
Newname(newname.last):='khaled';
update deptnested set
emp=newname where nodept=1;
end;
/
4-الحذف :
هناك طريقتان الاولى
باستخدام trim وهذه
الطريقة تحذف اخر صف في التجميعة ولايمكن اختيار اي عنصر في التجميعة:
Declare
Namedel namenested;
Begin
Select emp into namedel
From deptnested where
nodept=1;
Namedel.trim(1);
update deptnested set
emp=namedel where nodept=1;
end;
/
اما الطريقة الثانية
فهي باستخدام الامر delete(m) وهذه
الطريقة لا تحذف من الاخير بل يتم اختيار اي العناصر الذي تريد حذف فلو وضعنا
m=2 وكانت
المدخلات الجدول كما فعلا سابقا سيتم حذف العنصر الثاني والذي هو الموظف
sami
Declare
Namedel namenested;
Begin
Select emp into namedel
From deptnested where
nodept=1;
Namedel.delete(2);
update deptnested set
emp=namedel where nodept=1;
end;
/
وهذه الطريقة(طريقة
delete) هي من ابرز
الفوارق بين varray و
nested table
حيث varray
لا يمكنها حذف اي عنصر
ولكن تحذف فقط العنصر الاخير بعكس nested table
==============
د- التجميعة
NESTED TABLE من النوع الشيئ:
كما لاحظنا ان التجميعة
varray يتم
انشاءها من النوع الشيء فإن NESTED TABLE يتم إنشاءه ايضا من
النوع الشيء المعرف بواسطة المستخدم.
سوف نستخدم لشرح هذا
المثال نفس المثال الذي استخدمناه في varray من النوع
object
مثال ذلك :
لو اردنا انشاء جدول يحتوي على مسمى
الوظيفة وفي حقل اخر نكّون تجميعة تحتوي على اسماء الموظف وراتبة لجميع موظفين هذه
الوظيفة
اول خطوة هي انشاء الشيء
empobj والذي تم
انشاءه سابق عندما قمنا بشرح vaaray من النوع
الشيء واذا كنت لم تقم بانشاءه فهذا الكود :
Create type empobj
as object (nameemp
varchar2(50),salary number(6));
/
ثاني خطوة
هي إنشاء التجميعة nested table باستخدام الشيء
empobj كمايلي
Create type
empnestedobj as table of empobj;
/
ثالث خطوة
نقوم بإنشاء الجدول كمايلي:
Create table jobnested
(job_name varchar2(50),
employee empnestedobj)
nested table
employee store as
nestedtablesimple;
* التعامل مع الجدول
السابق من خلال اوامر sql
1- الاضافة :
لكي تقوم بادراج بيانات
في الجدول السابق نقوم بمايلي:
Insert into jobnested
Values('manager',
empnestedobj(empobj('ali',6000),
empobj('sami',7000),
1-
التحديث : يتم
التحديث باستخدام pl/sql كمايلي:
مثلا لتغير راتب الموظف
ali الموظف الاداري اي في
مسمى وظيفتها manager الى 9000
Declare
Editsal empnestedobj;
Editempobj empobj;
i number:=1;
Begin
Select employee into
editsal
From jobnested where
job_name='manager';
Loop
Editempobj:=editsal(i);
If (i=editsal.count)
then
Exit;
Elsif
(editempobj.nameemp='fahad') then
Editempobj.salary:=9900;
Editsal(i):=editempobj;
End if;
i:=i+1;
end loop;
update jobnested set
employee=editsal where job_name='manager';
end;
/
3- التحديث بالاضافة
update(append)
:-
Declare
Editemp empnestedobj;
Begin
Select employee into
editemp
From jobnested where
job_name='manager';
Editemp.extend;
Editemp(editemp.last):=empobj('mohammed',7000);
update jobnested set
employee=editemp where job_name='manager';
end;
4- الحذف
delete(trim)
:
هناك طريقتان الاولى
باستخدام trim وهذه
الطريقة تحذف اخر صف في التجميعة ولايمكن اختيار اي عنصر في التجميعة:
declare
empdel empnestedobj;
begin
Select employee into
empdel
From jobnested where
job_name='manager';
Empdel.trim(1);
update jobnested set
employee=empdel where job_name='manager';
end;
/
اما الطريقة الثانية
فهي باستخدام الامر delete(m) وهذه
الطريقة لا تحذف من الاخير بل يتم اختيار اي العناصر الذي تريد حذف فلو وضعنا
m=2 وكانت
المدخلات الجدول كما فعلا سابقا سيتم حذف العنصر الثاني وهو الموظف sami
وفيمايلي الكود
الطريقة الثانية
declare
empdel empnestedobj;
begin
Select employee into
empdel
From jobnested where
job_name='manager';
Empdel.delete(2);
update jobnested set
employee=empdel where job_name='manager';
end;
/
|