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

 

المنتديات

 

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

 

قسم التصاميم

 

راسلنا

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

 

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

 

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

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

                                         empobj('fahad',6500)));

 

 

 

 

 

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;

/

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

 

     

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

2003

شبكة بكسل

www.pxll.com