SQL Practice - PL/SQL

23
والتحكمماسبات هندسة الثالثة السنة البيانات ر قواعد ا مقرلسابعةعملية اسة الل ال1 رات الزئية:تفساس أمثلة على ا1 - طلوبن ا كا إذا إعادة يتقاضى الذي)وظفا( وظفت ا بيانا راتب أك ثا. select * from emp where sal = (select max(sal) from (select sal from emp where sal<> (select max(sal) from emp))); ختيارم على استععتمد فكرة ا تك الرواتب تل حساب أك ها, ومنستبعاد أك الرواتب مع اعادة ا. 2 - طلوبن ا كا إذال جديد إضافة سجدول ال إلemp أرقامك لتاموظف هو الرقم ا : رقم اوظف, اسم اسجل اوظف اahmad , الراتب8000 هنة , اmanager م القسم , رق20 , وبقيةلبيانات اnull ... insert into emp values( (select max(empno)+1 from emp),'ahmad','manager',null, null,8000, null, 20, ); 3 - فة امقل قم بإضاAddress دول ال إلemp وظف...مة ان إقاد عنواد والذيalter table emp add address varchar2(50); وظف يكتبوان ا عن اض أن وبافلتام:شكل ا بال‘department location – company buildings employee no’ وظفوان ا يبتدئ عن أيوقع عمل فيه ي القسم الذي بـ متبوعا- لسلة نصية س company buildings وعة بـ متب) كة الشر من قبلقدم السكن ممكان( - وظف رقم هذا ا empno الذي استخدامه لت حد ي د كة...ت الشر بنايا لث يقطنهام الشقة ا رقسملموظف ذي اوان ل العن تعبئة حقلطلوب اscott ناسبة...لقيمة ا باupdate emp set address =(select loc||' - company buildings - '||empno from emp,dept where emp.deptno=dept.deptno and lower(emp.ename)='scott') where lower(ename)=’scott’; العروضviews : تفسار تنفيذ اساتج عن اضي نرة عن جدول افرض عبا العsql ... create view view_name as select_ statement; كلماتلسابقة بالتعليمة ا تبدأ الفتاحية اcreate view ليتم إنشاؤه, ي سيسم العرض الذيوعة با متبكلمة ذلك الجوزة اas عبارةوعة ب متبselect كاملة...

description

Structured query language practice. Sub-queries with examples. Views, indices, table bindings.Oracle PL/SQL introduction

Transcript of SQL Practice - PL/SQL

Page 1: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

1

أمثلة على االستفسارات اجلزئية: .ثاين أكرب راتببيانات املوظف )املوظفني( الذي يتقاضى إعادة إذا كان املطلوب -1

select * from emp where sal =

(select max(sal) from

(select sal from emp where sal<>

(select max(sal) from emp)));

الرواتب مع استبعاد أكربها, ومن مث حساب أكرب تلك الرواتب تعتمد فكرة االستعالم على اختيار .املعادة

: رقم املوظف هو الرقم التايل ألكرب أرقام empإىل اجلدول إضافة سجل جديد إذا كان املطلوب -2

, وبقية 20, رقم القسم manager, املهنة 8000, الراتب ahmadاملوظفني املسجلني, اسم املوظف ...nullالبيانات

insert into emp values(

(select max(empno)+1 from emp),'ahmad','manager',null, null,8000, null, 20, );

والذي حيدد عنوان إقامة املوظف... empإىل اجلدول Addressقم بإضافة احلقل -3

alter table emp add address varchar2(50);

بالشكل التايل: وبافرتاض أن عنوان املوظف يكتب ‘department location – company buildings – employee no’

companyمث سلسلة نصية -متبوعًا بـ القسم الذي يعمل فيه مبوقعأي يبتدئ عنوان املوظف

buildings مث رقم هذا املوظف -)مكان السكن مقدم من قبل الشركة( متبوعة بـ empno مت الذي رقم الشقة اليت يقطنها يف بنايات الشركة... ديحداستخدامه لت

بالقيمة املناسبة... scottاملطلوب تعبئة حقل العنوان للموظف ذي االسم update emp

set address =(select loc||' - company buildings - '||empno from emp,dept where

emp.deptno=dept.deptno and lower(emp.ename)='scott')

where lower(ename)=’scott’;

:viewsالعروض

... sqlالعرض عبارة عن جدول افرتاضي ناتج عن تنفيذ استفسار create view view_name as select_ statement;

متبوعة باسم العرض الذي سيتم إنشاؤه, يلي create view املفتاحيةتبدأ التعليمة السابقة بالكلمات كاملة... selectمتبوعة بعبارة as احملجوزةذلك الكلمة

Page 2: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

2

فإلنشاء عرض حيتوي على أرقام املوظفني وأمسائهم نكتب:create view empv1 as select empno, ename from emp;

...ا ب ي عليهأو جمموعة اجلداول اليتإن العرض ما هو إال واجهة ميكن من خالهلا التعامل مع اجلدول على العروض كما نقوم بتطبيقها على اجلداول select, delete, updateإذ نستطيع تطبيق تعليمات حاويًا على معطيات خاصة به... مستقلً ليس كيانًا فالعرض حبد ذاته باستثناء بعض احلاالت...

وإمنا يقدم طريقة للوصول إىل البيانات املخزنة يف اجلداول اليت ب ي عليها... فالعرض املب ي يف املثال عبارة عن جدول افرتاضي حيتوي عمودين مها اسم املوظف ورقمه... وحيتوي على كافة البيانات السابق

يانات مت تنفيذه من خالل اجلدول , وأي تعديل على تلك البemp)الرقم واالسم( املوجودة يف اجلدول emp سينعكس على العرضempv1 كما أن أي تعديل على البيانات مت تنفيذه من خالل العرض ,

empv1 سينعكس على اجلدولemp...

الغاية من استخدام العروض:تسمح العروض بتخزين االستفسارات املعقدة والكثرية االستخدام ضمن قاعدة البيانات, وحيث -1

: selectأننا نستطيع استخدام العرض من خالل تعليمة select * from view_name;

املعطيات. فبداًل من السماح للمستخدمني بالوصول إىل تسمح العروض باحلفاظ على أمن قاعدة -2كافة معطيات القاعدة, نستطيع السماح هلم بالوصول فقط إىل املعطيات اليت حيتاجوهنا, وذلك من

خالل تأمني وصوهلم إىل العروض اخلاصة هبم فقط...جلدول األصلي, فمثاًل نستطيع أن جنعل أمساء األعمدة اليت حيتويها عرض ما خمتلفة عن أمسائها يف ا

كما يلي: empv1نستطيع كتابة تعليمة إنشاء العرض create view empv1 as select empno no, ename name from emp;

كما ونستطيع استخدام الصيغة التالية:create view empv1(no, name) as

select empno, ename from emp;

عت ضمن قوسني بعد اسم العرض, كما أن ترتيب هذه األمساء وحيث أن أمساء األعمدة اجلديدة وض ...selectموافق لرتتيب اختيار األعمدة يف عبارة

مهما كانت درجة تعقيدها أو عدد اجلداول الداخلة sqlنستطيع بناء العرض اعتمادًا على أي تعليمة فيها...

املوظفني يف كل قسم نكتب:على سبيل املثال, إلنشاء عرض حيتوي على أمساء األقسام وعدد create view dept_work_power as

select dname, emp_num from dept,

Page 3: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

3

(select deptno, count(ename) emp_num from emp group by deptno) emp_nums

where emp_nums.deptno=dept.deptno;

(: ميكن أن يتم بناء عرض اعتماداً على عرض آخر...1مالحظة) ميكن تنفيذ االستفسارات على العروض متامًا مثلما يتم تنفيذها على اجلداول العادية...: (2)حظةمال

اليت تتم من خالل العروض فهي مقيدة بعدد من updateوالتحديث insertأما بالنسبة لإلدخال الشروط:

جيب أن يكون العرض معتمدًا على جدول أساسي واحد فقط, فال ميكن مثاًل تنفيذ -1 ...joinهلا عملية ربط sqlعمليات إدخال أو حتديث على عروض تتضمن عبارة

إذا كان العرض مب ي على أساس عرض آخر, جيب أن يكون العرض اآلخر قاباًل -2 للتحديث واإلدخال...

على أمساء األعمدة فقط, بدون أعمدة حمسوبة )اعتماداً selectجيب أن حتتوي عبارة -3 مد على توابع جتميع...على أعمدة أخرى( أو تعت

ال ميكن التحديث أو اإلدخال إىل العروض اليت تتضمن استفسارات جتميع... -4

.distinctال ميكن التحديث أو اإلدخال إىل العرض اليت تتطلب أسطر -5

ميكن التحديث أو اإلدخال إىل العروض اليت حتتوي على استفسار جزئي بشرط أن يعتمد -6 ول الذي يعتمد عليه االستفسار اخلارجي أيضاً...هذا االستفسار على نفس اجلد

ال ميكن اإلدخال إىل العروض اليت ال حتتوي على أعمدة مفتاح أساسي يف الوقت الذي -7 توجد فيه مثل تلك األعمدة يف اجلدول األصلي الذي ب ي عليه العرض...

:كما يلي متبوعة باسم العرض drop viewحلذف العرض نستخدم التعليمة

drop view view_name;

:indexesاألدلة أو الفهارس عبارة عن بنية معطيات تؤمن وصواًل سريعًا إىل جمموعة أسطر يف جدول ما, وذلك indexالدليل

(. وباعتبار أن index keyاعتمادًا على قيمة عمود )حقل( أو أكثر )وهذا ما نسميه مفتاح الدليل تقنيات حبث DBMSضمن الدالئل, فيمكن أن يستخدم نظام ختزين قيم املفتاح يتم بطريقة مرتبة

سريعة إلجياد القيم املطلوبة بدل اللجوء إىل تقنيات البحث يف كل سطر من جمموعة أسطر غري مرتبة ضمن اجلدول وهي طريقة بطيئة...

Page 4: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

4

. إذا ما قمنا authorاسم املؤلف أحد واصفاته هو booksيف نظام مكتبة, لدينا جدول الكتب بإنشاء دليل هلذا اجلدول مفتاحه اسم املؤلف, فإن هذا الدليل حيتوي على قائمة بأمساء املؤلفني مرتبة

أجبدياً كما وحيتوي أيضاً على قائمة مبواضع األسطر املقابلة )لكل مؤلف( يف جدول الكتب.مرتبة بأمساء ورغم أن األسطر يف جدول الكتب خمزنة بشكل عشوائي بدون أي ترتيب, فإن وجود قائمة

املؤلفني مع قائمة مبواضع األسطر املقابلة من جدول الكتب )عناوين األسطر( يسمح بالبحث السريع بعد ذلك باستخدام قيمة عنوان السطر املقابل DBMSعن مؤلف حمدد ضمن الدليل... يقوم نظام الـ

لوب يف جدول الكتب. وهذا جينب واملخزنة يف بنية الدليل للوصول مباشرة إىل السطر )أو األسطر( املط النظام اللجوء إىل عملية حبث تسلسلية بطيئة جداً يف جدول الكتب...

عند طلب عملية حبث على هذا اجلدول DBMSعند القيام ببناء دليل على جدول معني, يقوم نظام بأن عملية البحث باستخدام هذا الدليل للوصول السريع إىل املطلوب عندما يقرر النظام اخلبري املرافق

باستخدام الدليل هي األسرع...

العالقة بني الدليل واملفتاح األساسي:يقوم النظام آليًا بإنشاء دليل يستخدم primary keyيف الواقع, وعند القيام بتعريف مفتاح أساسي

عمود )أو أعمدة( املفتاح األساسي...م املستخدم بإدخال معطيات لسطر جديد إىل جدول ما اخلطوة األوىل اليت يلجأ إليها النظام عندما يقو

)وذلك يف حال وجود دليل أو مفتاح أساسي( هي التحقق من وحدانية قيم حقل هذا الدليل. حيث يقوم الدليل بتأمني الوحدانية, وبداًل من اللجوء إىل حبث يف قيم اجلدول للتحقق من الوحدانية عند عدم

بحث عن قيم جقل الدليل يف بنية الدليل املرتبة وبشكل أسرع بكثري للتحقق توفر الدليل, يقوم النظام بال من الوحدانية...

حتديد الدالئل الواجب إنشاؤها:

بالطبع عندما يكون هنالك مفتاح أساسي يف جدول ما, لن يكون لك اخليار يف إنشاء دليلك ألن . على كل حال, ميكنك إنشاء دالئل يقوم بإنشاء دليل للمفتاح األساسي بشكل أوتوماتيكيالنظام

أخرى لتسهيل وتسريع عملية الوصول إىل املعطيات يف عمود أو جمموعة أعمدة حمددة يف اجلدول. هنالك جمموعة من املالحظات املرتبطة بإنشاء واستخدام األدلة:

يأخذ إنشاء الدليل مساحة ختزين يف قاعدة املعطيات. -1

Page 5: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

5

ديل أو حذف على األعمدة فإن النظام يضطر لتحديث عند القيام بعمليات إدخال أو تع -2الدليل باإلضافة إىل اجلدول األساسي وهذا ميكن أن يبطئ عملية حتديث اجلدول

وباألخص عندما يكون هنالك الكثري من األسطر يف اجلدول...

حتسن األدلة وبشكل ملحوظ عملية الوصول إىل املعطيات... -3

التحديث وسرعة الوصول إىل املعطيات. القاعدة األساسية يف هذه باحملصلة جيب املوافقة بني سرعةواألعمدة اليت تستخدم بشكل متكرر لتحديد foreign keyاحلالة هي إنشاء أدلة للمفاتيح اخلارجية

...whereشروط االختيار ضمن عبارة

إنشاء األدلة: التالية:, وهلا الصيغة create indexيتم إنشاء األدلة باستخدام عبارة

create index index_name on table_name(index_key_columns)

متبوعة باسم الدليل, ليأيت بعد ذلك الكلمة احملجوزة create indexتبدأ التعليمة بالكلمات احملجوزة on متبوعة باسم احلدول الذي نريد إنشاء الدليل عليه, ويليه ضمن أقواس أمساء األعمدة املستخدمة

تيح للدليل...كمفا نكتب: empيف اجلدول enameإلنشاء دليل مفتاحه العمود

create index ename_index on emp(ename);

بشكل افرتاضي, يسمح الدليل بإدخال قيم متكررة ويرتبها بشكل تصاعدي. باملقابل إذا ما أردنا جعل , كما يلي:uniqueة احملجوزة يدة )كما يف املفتاح األساسي( نستخدم الكلمقيمة حقل الدليل وح

create unique index ename_index on emp(ename);

أن يتم كما ذكرنا سابقًا يتم ترتيب القيم يف حقل مفتاح الدليل بصورة تصاعدية, أما إذا ما أردنا كما يلي: descالرتتيب تنازلياً فإننا نستخدم الكلمة

create index ename_index on emp(ename desc);

نكتب: ename, jobمركب من مفتاحني مها العمودان empوإلنشاء دليل على اجلدول create index compound_index on emp(ename, job);

كما وميكن اعتماد أمناط خمتلفة من الرتتيب ملفاتيح الدليل املركب, كما يلي:create index compound_index on emp(ename asc, job desc);

متبوعة باسم الدليل, كما يلي: drop indexوحلذف الدليل نستخدم التعليمة drop index index_name;

Page 6: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

6

الربط اخلارجي: يقوم الربط اخلارجي بني جدولني بإنشاء جدول جديد حيتوي على مجيع األسطر من كل ما ال جيد نظام الـ جدول حىت وإن مل يكن هنالك أسطر متطابقة بينهما باعتماد حقل الربط. عند

DBMS سطرًا موافقًا من اجلدول الثاين لسطر من اجلدول األول يقوم بوضع قيمNulls يف األعمدة املوافقة يف اجلدول الناتج عن الربط.

على سبيل املثال, يف نظام االمتحانات الذي مر معنا سابقاً, إذا كان املطلوب إعادة أمساء مجيع إن إجراء عملية واد اليت جرى التقدم لالمتحان إليها من قبل أولئك الطالب...الطالب باإلضافة إىل امل

بني one-to-manyبني جدول الطالب وجدول املقررات )كانت العالقة من النوع ربط داخلي اجلدولني السابقني( لن يعيد أمساء الطالب الذين مل يتقدموا لالمتحان يف أي مادة من املواد... ويكون

خلارجي هو احلل...الربط ا

عملية الربط اخلارجي من الناحية اجلربية: studentسنوضح األنواع املختلفة للربط اعتماداً على نظام االمتحانات... وبالتحديد جدويل الطالب

حمتويات اجلدولني مبينة فيما يلي:. وبافرتاض أن courseواملقررات

أن بعض الطالب مل يتقدموا لالمتحان يف أي مادة... والبعض اآلخر مل يتقدم جلمي نالحظ هنا

املواد...يتعلق باجلدول أو اجلداول اليت يتم ربطها وباألسطر يوجد عمليًا ثالثة أنواع من الربط اخلارجي. وذلك

غري املتوافقة اليت نرغب بتضمينها إىل ناتج عملية الربط. وهذه األنواع هي:: حيتوي ناتج عملية الربط هذه على مجيع أسطر اجلدول left outer joinالربط اخلارجي اليساري

كما يلي: األولselect columns … from table1 left outer join table2 on join-condition;

مع املقررات اليت تقدموا إليها... نكتب: أسماء جميع الطلب إذا كان املطلوب إعادةSelect name, course_name, mark from student left outer join course;

وسيكون الناتج بالشكل:

name no mark course_name no ali 1 85 database 1

ahmad 2 90 cpu strucuter 1 muhammad 3 85 signals 1

rashad 4 85 database 2 85 cpu strucutre 2

Page 7: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

7

NAME COURSE_NAME MARK

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

Ali database 85

Ali cpu structure 90

Ali signals 85

Ahmad database 85

Ahmad cpu structure 85

Muhammad

rashad

كما يلي: usingونستطيع كتابة االستفسار السابق باستخدام select name, course_name, mark from student left outer join course using (no);

الربط اخلارجي اليمي ي: ويعاكس متامًا الربط اخلارجي اليساري حيث حيتوي الناتج على مجيع أسطر

ويتم تنفيذه بالصورة التالية: اجلدول الثاين يف عالقة الربط...select columns … from table1 right outer join table2 on join-condition;

فإلعادة أمساء املواد مع أمساء الطالب الذين تقدموا إليها نكتب:Select course_name, name, mark from student right outer join course using

(no);

:مكافئ له االستعالم التايلفإن ىل استعالم الدمج اليساري, وبالعودة إSelect course_name, name, mark from course right outer join student using

(no);

وهو عبارة عن اجتماع الدجمني اخلارجي واليساري واخلارجي اليمي ي, فهو حيتوي الربط اخلارجي التام:

وبالتايل فإنه ليس يف األمكنة املناسبة... nullsاجلدولني مع وضع قيم على مجيع األسطر من كال أمهية... ةلرتتيب اجلداول يف عملية الربط التام أي

select columns … from table1 full outer join table2 on join-condition;

:PL/SQLمقدمة إلى لغة

يف نطاق الربجمة املهيكلة, فهي sqlعليمات الـ هي لغة إجرائية تسمح باستخدام ت PL/SQLإن لغة توابع الو proceduresجراءات اإلك named قد تكون مسماة blocksتسمح بتعريف بلوكات

functions رزم الوpackages قادجات الوtriggers ...أو غري مسماة anonymous blocks... طلوب...يف نطاق تعليماهتا لتأدية امل sqlهذه الكتل تستخدم الـ

:pl/sql blockمكونات ...variable declaration sectionمقطع التصريح عن املتحوالت -1

Page 8: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

8

...execution sectionمقطع التنفيذ -2

.exception handling sectionمقطع معاجلة االستثناءات -3

خدمة يف على تعريف جلميع املتحوالت املست وحيتوي declareبالكلمة املفتاحية مقطع التصريحيبدأ ...oracleالكتلة. وميكن أن يأخذ املتحول أي منط من أمناط املعطيات املتاحة يف

عند انتهاء كامل الشيفرة, أو بكلمة endوينتهي بالكلمة beginمقطع التنفيذ يبدأ بالكلمة exception اليت متثل بداية مقطع معاجلة االستثناءات... وهذا املقطع اختياري وحيتوي على طرق

معاجلة خمتلف األخطاء اليت ميكن أن حتدث يف الكتلة... :pl/sql blockيبني النص التايل البنية النظامية لـ

declare <declaration section>

begin <execution section>

exception <exceptions handling section>

end;

يتم تعريف املتحوالت يف قسم التصريح بالصورة التالية:variable_name data_type;

أي اسم املتحول متبوعاً بنمط معطياته... مثال:num number(9,2);

. وكبعض لغات الربجمة األخرى ميكن numberومنط بياناته numحيث مت تعريف متحول حيمل االسم إعطاء املتحول قيمة ابتدائية عند تعريفه, فتعريف املتحول السابق ميكن أن يكتب كما يلي:

num number(9,2) :=1.32;

...pascalمتاماً كما يف الـ =:حيث معامل اإلسناد هو

كما يلي: constantكما نستطيع تعريف الثوابت باستخدام الكلمة احملجوزة pi constant number(9,7):=3.1415926;

غري مسمى حلساب مساحة دائرة... pl/sql blockمثال: املطلوب كتابة declare

pi constant number(9,7):=3.1415926;

radius number;

area number;

begin

radius:=3;

area:=pi*power(radius,2);

dbms_output.put_line('the area is: '||area);

end;

Page 9: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

9

... ويف مقطع التنفيذ قمنا areaو radiusومتحولني piيف الكتلة السابقة قمنا بتعريف ثابت , يأخذ هذا التابع بارامرتين ليقوم حبساب ناتج رفع البارامرت األول إىل قوة powerباستخدام التابع

مقدارها البارامرت الثاين...املوجود يف احلزمة put_line اإلجراءباستخدام ولقد قمنا إلظهار املخرجات على الشاشة

dbms_output ذلك أن ...pl/sql إلجراءات والتوابع شأهنا شأن بقية لغات الربجمة تسمح بتجميع ا (...++cيف header filesوملفات رأسية pascalيف الـ units)وحدات packagesيف حزم يأخذ كبارامرت له أي سلسلة حمرفية... ونالحظ يف املثال أننا استخدمنا معامل الضم put_lineاإلجراء ...يف سلسلة واحدة قيم من أمناط خمتلفة إلحلاق

, فعلى سبيل املثال إذا selectاد, نستطيع تعبئة متحول بقيمة ما من خالل عبارة باإلضافة إىل اإلسن كما يلي: 10من النمط احملريف املناسب, نستطيع تعبئته باسم املوظف ذي الرقم vكان لدينا متحول

Select ename into v from emp where empno=10;

حول الذي نريد ملئه بالقيمة املطلوبة...متبوعة باسم املت intoحيث استخدمنا هنا الكلمة (... وتنفيذ الكتلة بـ ., يتم اإلهناء بنقطة )oracleعند كتابة املقطع السابق يف حمرر أوامر مالحظة:

(... وال بد من اإلشارة إىل أنه من الضروري توجيه اخلرج إىل الشاشة قبل تنفيذ الكتلة بغية عرض /) من خالل األمر, ويتم التوجيه put_lineناتج

set serveroutput on;

, وعلى فرض أننا ال empمن اجلدول enameمالحظة: إذا كان املطلوب اسرتداد قيمة من العمود مباشرة دون ما يلي فإننا نستطيع أن نكتب ,نعرف منط هذا العمود, ونريد تعريف متحول من منطه

الستعراض تركيبة اجلدول: descاحلاجة لتنفيذ األمر ename_var emp.ename%type;

فتم حتديده بذكر , أما منط املعطيات ename_varيف السطر السابق قمنا بتعريف متحول حيمل االسم type%اسم اجلدول متبوعاً بنقطة مث اسم العمود املطلوب منط معطياته متبوعاً مبا ندعوه مؤشر اخلواص

ى هذا فإذا كان املطلوب تعريف متحول باالسم والذي مهمته أن يعطي منط العمود للمتحول... وعلvar1 منط معطياته هو منط العمودloc يف اجلدولdept :فنستطيع أن نكتب مايلي

var1 dept.loc%type;

:يف أبسط شكل هلا التالية مماثلة يف مفهومها لبقية لغات الربجمة... هلا الصيغة :ifتعليمة

if some_condition then statement

else other_statement

end if;

...;end ifبالعبارة ifتنتهي تعليمة

Page 10: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

10

مع بعضها البعض بصور خمتلفة مماثلة لبقية لغات الربجمة... ifميكن أن تتداخل تعليمات if <some_condition> then <some_command>

elsif <some_condition> then <some_command>

else <some_command>

end if;

...elsifالحظ هنا الكلمة احملجوزة if <some_condition> then

if <some_condition> then <some_command>

end if;

else <some_command>

end if;

مالحظة: نستطيع إدخال قيم للمتحوالت أثناء التنفيذ متامًا كما وجدنا عند إدخال املعطيات يف عبارة insert وذلك باستخدام املعامل&...

, ويف 100يقوم بإدخال عدد والتحقق من كونه أكرب من pl/sqlمثال: اكتب بلوكًا غري مسمى بلغة ...3رفعه للقوة طباعة ناتج وإال ...2باقي قسمته على طباعةحال اإلجياب

declare

x number;

begin

x:=&x;

if x>100 then dbms_output.put_line(x||' mod 2 = '||x mod 2);

else dbms_output.put_line(x||' power 3 = '||power(x,3));

end if;

end;

أثناء التنفيذ... xاليت استخدمت يف إدخال قيمة لـ ;x:=&xالحظ تعليمة اإلسناد

3, ويوجد لدينا pl/sqlاحللقات: ميكن استخدام احللقات للتعامل مع جمموعة سجالت ضمن كتل نواع من احللقات:أ

: وميكن للحلقة هنا أن تتكرر حىت تصل إىل تعليمة simple loopsاحللقات البسيطة -1exit أوexit when...

: يتكرر تنفيذ حمتوى هذه احللقات عداً حمدداً من املرات...forحلقات -2

: يتكرر تنفيذ حمتوى هذه احللقات حىت يتحقق شرط معني...whileحلقات -3

هلا الصيغة العامة التالية: سيطة:احللقات الب

loop

statements

exit when

end loop;

Page 11: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

11

...!xوحساب قيمة xب إدخال عدد مثال: املطلو declare

x number; xfact number; i number;

begin

x:=&x;

xfact:=x;

i:=x;

loop

i:=i-1;

xfact:=xfact * i;

exit when i=1;

end loop;

dbms_output.put_line('the factorial of '||x||' is '||xfact);

end;

: هلا الصيغة العامة التالية:forحلقات for index in val1.. val2 loop

statements end loop;

, وحيث أنه يتم الفصل بني val2وينتهي بـ val1عداد أو دليل احللقة يأخذ قيمه من جمال يبدأ بـ قطتني )..(.القيمتني احلديتني للمجال بن

.forمثال: املطلوب تنفيذ برنامج العاملي السابق باستخدام حلقة declare

x number; xfact number; i number; begin

x:=&x; xfact:=1; for i in 2 .. x loop

xfact:= xfact * i; end loop; dbms_output.put_line('the factorial of '||x||' is '||xfact;) end;

: هلا الصيغة العامة التالية:whileحلقات while condition loop

statements

end loop;

:whileمثال: املطلوب إعادة كتابة برنامج العاملي باستخدام حلقة declare

Page 12: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

12

x number; xfact number; i number;

begin

x:=&x;

i:=2;

xfact:=1;

while i<=x loop

xfact:= xfact*i;

i:=i+1;

end loop;

dbms_output.put_line('the factorial of '||x||' is '||xfact);

end;

:cursorsاملؤشرات مساحة oracleاملؤشر عبارة عن بنية تؤمن وصواًل إىل نتائج استعالم ما ب ي عليه املؤشر... يستخدم

تسمح لنا بتسمية مساحة cursorsإن املؤشرات وختزين املعلومات املعاجلة. sqlعمل لتنفيذ عبارات , وصرحية implicitاملخزنة فيها. هنالك نوعان من املؤشرات: ضمنية املعطياتالعمل والوصول إىل

explicit حيث أن .pl/sql ح ضمنيًا عن مؤشر امسه تصرsql عبارات كافةمن أجلsql اخلاصةواحداً, أما من أجل االستفسارات اليت تعيد تعيد سطراً االستفسارات اليت وحتديداً املعطيات مبعاجلة

أكثر من سطر فيمكن التصريح بشكل واضح عن مؤشر ملعاجلة األسطر بشكل منفرد كل على حدة... يتم تعريف مؤشر بالصيغة العاملة التالية:

cursor cursor_name is select_statement;

مث عبارة االستعالم isليها اسم املؤشر متبوعاً بالكلمة احملجوزة ي cursorيبدأ التعريف بالكلمة املفتاحية الذي سيبىن عليه املؤشر...

مثال على مؤشر:cursor cur_emp is select * from emp;

open. يتوىل اإلجراء open, fetch, closeهنالك جمموعة من اإلجراءات للتعامل مع املؤشرات, أمهها ويتم استخدامه بالصورة التالية: املعطيات... فتح املؤشر وتأهيله جللب

open cursor_name; الذي يشري إليه املؤشر حالياً, تتم عملية اجللب إىل سطر املعطيات احلايلجلب fetchيتوىل اإلجراء

سجل من منط السجالت )السطور( اليت يعيدها االستعالم الذي ب ي عليه املؤشر...fetch cursor_name into record_type;

فالغاية منه إغالق املؤشر عند انتهاء احلاجة إليه... closeأما إجراء

close cursor_name; بالنسبة لتعريف السجل الذي سيتم جلب سطر املعطيات إليه فإنه يتم عادة بالصورة التالية:

record_var cursor_name%rowtype;

Page 13: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

13

املعامل هو اسم املؤشر, و cursor_nameهو اسم متحول السجل, record_varحيث أن %rowtype ...وبالتطبيق على مثالنا, نكتب: يقوم بإعادة منط السجل أو السطر

declare

cursor cur_emp is select * from emp;

rec_emp cur_emp%rowtypel;

begin

open cur_emp;

fetch cur_emp into rec_emp;

close cur_emp;

end;

ميكن أن , فإن تعريف منط السجل empيف هذا املثال قد قمنا باختيار مجيع حقول اجلدول وباعتبار أننا يتم بالصورة التالية كذلك:

rec_emp emp%rowtype;

الزم... closeمث fetchمث open: إن تسلسل العمليات (1)مالحظةيشري إىل أحدها, ومع : مبا أن املؤشر يتعامل مع جمموعة من السجالت وهو يف حلظة ما (2)مالحظة

يتقدم املؤشر ليشري إىل السجل التايل, فإنه من الضروري يف حلظة ما التوقف fetchكل عملية جلب عن جلب املعطيات عندما ال يعود املؤشر يشري إىل أي سجل, ويف الواقع ميكن اختبار مثل هذا األمر

عندما ال trueفإنه يأخذ القيمة فعند استخدامه يف شرط ما notfound%مبا ندعوه مؤشر اخلواص يعود املؤشر يشري إىل أي سجل... ويتم استخدام مثل هذه املؤشرات بالصورة التالية:

cursor_name%notfound

بذكر اسم املؤشر متبوعاً مبؤشر اخلواص املناسب...

على استخدام املؤشرات: تطبيقجلميع املوظفني بالقيمة Addressب تعبئة حقل العنوان يف بداية احملاضرة, املطلو (3)بالعودة إىل املثال

استخدام مؤشر مع حلقة...وذلك ب املناسبة...declare

cursor cur_emp is select * from emp;

rec_emp cur_emp%rowtype;

location dept.loc%type;

begin

open cur_emp;

loop

fetch cur_emp into rec_emp;

select loc into location from dept where deptno=rec_emp.deptno;

update emp

set address=location||' - company buildings - '||rec_emp.empno

Page 14: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

14

where empno=rec_emp.empno;

exit when cur_emp%notfound;

end loop;

close cur_emp;

end; للمؤشرات, وذلك عند التعامل مع open, close, fetchمالحظة: باإلمكان االستغناء عن عمليات

:ليصبح املقطع الربجمي السابق كما يلي, forاملؤشر من خالل حلقة declare

cursor cur_emp is select * from emp;

rec_emp cur_emp%rowtype;

location dept.loc%type;

begin

for rec_emp in cur_emp loop

select loc into location from dept where deptno=rec_emp.deptno;

update emp

set address=location||' - company buildings - '||rec_emp.empno

where empno=rec_emp.empno;

end loop;

end;

:proceduresاإلجراءات . ++C( يف الـ voidوهي مبفهومها مماثلة متامًا لإلجراءات يف الباسكال أو التوابع اليت ال تعيد قيمة )

الصيغة العامة لتعليمة إنشاء اإلجراء مبينة يف الشكل:create or replace procedure proc_name(arg1 type data_type, arg2 …) as

begin

statements;

end;

تتمثل يف حال ( الغاية منه or replaceبعدها قسم اختياري ) createتبدأ التعليمة بالكلمة احملجوزة د نسخة سابقة من هذا اإلجراء فإنه سيتم استبداهلا هبذه النسخة اجلديدة اليت يتم إنشاؤها اآلن... وجو

متبوعة باسم اإلجراء, مث األقواس احلاصرة للبارامرتات... procedureيلي ذلك الكلمة احملجوزة بالنسبة للبارارمرتات فإنه يتم التصريح عنها بالصورة التالية:

arg_name type datatype

ونع ي به أن البارامرت هو بارامرت inأي بذكر اسم البارامرت أواًل متبوعاً بنوعه, وهذا النوع ميكن أن يكون )مترير باملرجع, ويف الباسكال كنا نكتب ونع ي به أن البارامرت بارامرت خرج out, )مترير بالقيمة( دخل

ويع ي أن البارامرت هو بارامرت دخل in out, (&مز كنا نكتب الر ++C, ويف الـ varقبل اسم البارامرت , كما ميكن أال نذكر نوع البارامرت ليتم اعتباره بارامرت دخل فقط... ويلي نوع البارامرت منط وخرج معاً

معطياته...

Page 15: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

15

مثال:x in number; بارامرت دخل x out number; بارامرت خرج x in out number; وخرج معاً بارامرت دخل x number; بارامرت دخل بعد االنتهاء من التصريح عن البارامرتات )ميكن أال يكون لإلجراء أي بارامرتات(, نضع الكلمة احملجوزة

as أوis مثbegin وend ...وبينهما العبارات التنفيذية ممرر كبارامرت إليه... xمثال: كتابة إجراء يعيد العاملي لعدد

create or replace procedure factorial(x in number, fact out number)

is

i number;

begin

fact:=1;

for i in 2..x loop

fact:=fact * i;

end loop;

end;

كما يلي: pl/sqlيف بلوك بعد ذلك نستطيع استدعاء هذا اإلجراء declare

xx number; xxfact number;

begin

xx:=&xx;

factorial(xx,xxfact);

dbms_output.put_line(xxfact);

end;

, ++Cوللتوابع اليت تعيد قيمة يف الـ pascal: مشاهبة مبفهومها للتوابع يف الـ functionsالتوابع

والتعليمة الالزمة إلنشائها هلا الصيغة العامة التالية:create or replace function func_name(arg1 type data_type, arg2 …) return

data_type as

begin

statements;

return …;

end; لتعليمة إنشاء اإلجراءات, غري أهنا تتضمن يف التصريح ذكراً اإن تعليمة إنشاء التوابع مشاهبة إىل حد م

ة , كما وتتضمن يف العبارات التنفيذية الكلمreturn data_typeلنوع القيمة اليت سيعيدها التابع return ...متبوعة بالقيمة اليت سيعيدها التابع

Page 16: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

16

ممررة كبارامرت إليه... xمثال: املطلوب إنشاء تابع حلساب عاملي قيمة create or replace function fact(x in number) return number

as

i number; xfact number;

begin

xfact:=1;

for i in 2..x loop

xfact:=xfact*i;

end loop;

return xfact;

end;

, كما يلي:pl/sqlونستطيع اآلن استخدام هذا التابع يف أي بلوك declare

x number;

begin

x:=&x;

dbms_output.put_line(fact(x));

end;

:triggersالقوادح بعض ى عل تنفيذ أوامر معينةعطيات عند أو تصرفات جيب أن تقوم هبا قاعدة امل تعرف القوادح أفعاالً

بالنسبة للمستخدم, فالقوادح تنفذ من قبل )غري مرئية( تعترب عملية تنفيذ القوادح شفافة ...كائناهتا ,insertوهي كما سبق وذكرنا data manipulationتعديل املعطيات قاعدة عند تنفيذ أوامر ال

update, delete ندعوها أوامر(DML)ح للقوادح كما ... أي مبعىن لن يكون هنالك استدعاء صري ...استدعاء األوامر السابقةهو احلال مع اإلجراءات والتوابع, بل هي تنفذ تلقائياً عند

منطًا من القوادح. حيث يتم تعريف منط القادح من خالل منط عملية 14أمناط القوادح: يوجد هنالك

القدح واملستوى الذي ينفذ عنده هذا القادح...سطر كل من أجل هذه القوادح يتم تنفيذ: row-level triggers قوادح على مستوى السطر -1

, إن كل سطر يتم تعديله يف هذا اجلدول empفمثاًل من أجل اجلدول معني... DML عليه أمريطبق الالزمة إلنشاء هذا النوع من القوادح create triggerميكن أن يعاجل من قبل قادح. حتتوي تعليمة

...for each rowعلى العبارة تنفذ هذه القوادح مرة عند تنفيذ كل : statement-level triggersقوادح على مستوى العبارة -2

empسطرًا يف اجلدول 50فمثاًل إذا متت عملية إدخال ,عبارة )جمموعة تعليمات تؤدي غرضًا ما( دة...فإن القادح على مستوى العبارة هلذا اجلدول سوف ينفذ مرة واح ,ضمن عبارة واحدة

Page 17: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

17

بكائن اجلدول, خبالف اإلجراءات متامًا ومن الضروري أن نشري إىل أن القادح هو كائن مرتبط والتوابع...

كما ذكرنا سابقاً, يتم تنفيذ القوادح بسبب استدعاء : before/after triggersقوادح قبل وبعد -3ادح لتعمل مباشرة قبل أو بعد تنفيذ املعطيات, ومن مث فإنه من املمكن استخدام القو لتعديلأوامر معينة

هذه األوامر... ويف هذا النوع من القوادح سنكون قادرين على الرجوع إىل القيم القدمية واحلديثة ...new, oldيت تتعامل معها أوامر املعاجلة, وذلك من خالل الكلمتني احملجوزتني للمعطيات ال

يف قاعدة DMLادح أن تنفذ قبل تثبيت أثر أمر الـ عندما نريد لتعليمات الق beforeعمومًا نستخدم املعطيات...

جمموعة من على تنفيذ oracle محليستخدم هذا النوع من القوادح من أجل : instead ofقوادح -4بداًل من العملية اليت أدت لتفعيل هذا القادح. فالتعليمات الربجمية يف القسم التنفيذي وذلك التعليمات

اليت فعلت القادح... deleteأو updateأو insertاليت سيتم تنفيذها بداًل من أوامر من القادح هي القوادح املمكنة هي:أمناط مما سبق تكون

before insert row

before insert statement

after insert row

after insert statement

before update row

before update statement

after update row

after update statement

before delete row

before delete statement

after delete row

after delete statement

instead of row

instead of statement

التعليمة العامة إلنشاء القوادح هلا الصيغة التالية:create [or replace] trigger trigger_name

{before|after|instead of}

{delete|

insert|

update [of column [, column]...]}

[or {delete|

insert|

update [of column [, column]...]}]...

on {table|view}

for each {row|statement} [when condition] pl/sql block

Page 18: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

18

التعبريمن خالل طريقة ن األفضل صياغتهامة إنشاء القادح, كان منظرًا لتعدد اخليارات يف تعلي ... وفيها:formal languagesاملستخدمة يف اللغات الصورية

احتمال تعدد هذا احملتوى كذلك تدل عل حمتوى اختياري, كما وتتضمن []األقواس املتوسطة االختياري...

تدل على حمتوى إلزامي... {}أقواس اجملموعات طقية...املن orمكافئ لـ |الرمز

إلزامية... before, after, instead ofفالسطر الثاين من التعليمة يدل على أن واحدة من الكلمات متبوعة باسم القادح. يتم بعد ذلك حتديد نوع create triggerتبدأ التعليمة بالكلمات املفتاحية

ذي سيتم استدعاء القادح ال DMLيليها حتديد اسم أمر الـ ...before/after or instead ofالقادح تتعامل مع السطر كله, أما تعليمة deleteو insertعند تعديله... ونشري هنا إىل أن تعليمات الـ

update ...فقد تتعامل معه كله أو مع عمود أو أعمدة حمددة منه يتم ذكرها بعدها DMLللتنفيذ عند عدة أوامر وتستخدم جلعل القادح قاباًل orذلك عبارة اختيارية تبدأ بـ جند بعد

يلي ذلك ذكر اجلدول أو العرض الذي سريتبط به القادح... وحباالت خمتلفة..., وعند استخدامها سيتم تنفيذ القادح على مستوى السطر, وإال for each rowهنالك أيضًا العبارة

عينة ملعرفة مىت سينفذ فتستخدم لوضع شروط م whenأما التعليمة سيتم تنفيذه على مستوى العبارة... القادح...

أمثلة على القوادح:

املطلوب االحتفاظ بأرقام ورواتب املوظفني الذين كانت ...إذا قررت الشركة زيادة الرواتب مبقدار ما -1يف جدول منشأ هلذا الغرض حيمل بعد الزيادة وبقيت كذلك 1000قبل الزيادة أقل من تلك رواتبهم )االحتفاظ بالرواتب قبل الزيادة( ...below_thousاالسم

, وهذا empعلى اجلدول updateالذي جيري تنفيذه هو التحديث DMLمن الواضح أن أمر الـ ... ويهمنا ختزين قيم الرواتب القدمية قبل أن يأخذ األمر مفعوله يف قاعدة salالتحديث يطال العمود

وبشرط أن القيم salاملطبق على العمود before updateالبيانات, فلذلك يكون القادح املناسب هو ...1000القدمية للراتب أقل من

create or replace trigger emp_sal_bef_updt

before update of sal on emp

for each row

when(old.sal<1000 and new.sal<1000)

begin

insert into below_thous values(:old.empno,:old.sal);

Page 19: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

19

end;

oldمن أجل الوصول إىل القيم اجلديدة )ما بعد التحديث( و newلقد استخدمنا هنا املعاملني للوصول إىل القيم القدمية )ما قبل التحديث(... ونضع نقطتني : قبل أي من هذين املعاملني عندما

لغة يتعامل مع وال بد من اإلشارة هنا إىل أن مفسر ال (...endو beginيردنان يف حسم القادح )بني هذين املعاملني كأمساء للجدول...

مثل: empالختبار القادح قم بتنفيذ تعليمة حتديث على اجلدول update emp set sal=sal + 10;

دون تنفيذ تعليمة below_thousمالحظة: إذا ما أردنا للقادح السابق أن ينفذ فقط على اجلدول بداًل من instead of updateببساطة تغيري منطه إىل نستطيع empعلى اجلدول updateالتحديث

before update... على جدول ضمن قادح واحد شرط أن insert, update, deleteميكن جتميع عدة قوادح ألوامر -2

تنفذ مجيعاً على مستوى واحد )مستوى السطر أو مستوى العبارة(..., نريد اآلن bonusيدعى empختطيطه( من اجلدول كنا قد أشرنا سابقًا إىل وجود جدول جزئي )يف

... وذلك bonusأن تتم إضافة البيانات املناسبة إىل اجلدول empعند إضافة أي سجل إىل اجلدول ...updateوالـ insertبتعديل القادح الوارد يف املثال السابق حبيث يعاجل حاليت الـ

create or replace trigger emp_sal_bef_updt_ins_row

before insert or update of sal on emp

for each row

begin

if inserting then

insert into bonus values(:new.ename, :new.job, :new.sal, :new.comm);

else

if :old.sal<1000 and :new.sal<1000 then

insert into below_thous values(:old.empno,:old.sal);

end if;

end if;

end;

املنفذ حالياً DMLواليت تدل على أن أمر الـ insertingاستخدمنا يف املقطع الربجمي السابق الكلمة من أجل التحديث واحلذف... deletingو updatingهو اإلدخال... بالطبع هنالك الكلمات

, ومن مث تنفيذ اجلزء DMLديد أمر الـ ار منطقية يف البداية لتحبيف القادح السابق تتم عملية اختونقل شرطها إىل حسم القادح يف القسم اخلاص whenال حظ هنا إلغاء عبارة املناسب من القادح...

بالتحديث, نظراً ألن هذا الشرط ال يصلح يف حال اإلدخال... ما يلي: ال بد من اإلشارة هنا إىل

Page 20: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

20

نظرًا لعدم وجود قيم insertخال يف عملية اإلدفقط newكن استخدام املعامل مي -1 قدمية...

.لعدم وجود قيم جديدةنظراً deleteفقط يف عملية احلذف oldكن استخدام املعامل مي -2

نظرًا لوجود قيم updateمعًا يف عملية التحديث oldو newميكن استخدام املعاملني -3 قدمية وجديدة...

Page 21: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

21

Page 22: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

22

فهذا األمر يفرتض تغيرياً … إذا فرضنا أن الشركة لسبب ما قررت نقل أحد أقسامها من والية إىل أخرىن واملطلوب كتابة القادح املناسب لتعديل تلك العناوي… يف عناوين املوظفني العاملني يف ذلك القسم

أن يتم Oklahomaواملوضع اجلديد هو Dallasاملوضع القدمي للقسم هو إذا علمت أنه يف حال كان فيها نظرًا ألن الشركة متلك مساكن fort smithتعديل عنوان املوظف حبيث تصبح مدينته هي

...Oklahomaباإلضافة إىل قرهبا من لتعيني قيمة deptعلى اجلدول updateمن الواضح أن نقل أحد األقسام يع ي إجراء عملية حتديث

فلنا اخليار يف ذكر هذا العمود locومبا أن عملية التحديث هنا تطال العمود املوضع اجلديد للقسم.أي بعد تنفيذ عملية afterكما أن زمن تنفيذ القادح هو أو عدم ذكره... updateبعد كلمة يت أثر تعديل املواضع يف بعد تثب empألنه من املنطقي أن يتم حتديث العناوين يف اجلدول التحديث

...deptاجلدول

Page 23: SQL Practice - PL/SQL

اجللسة العملية السابعة –مقرر قواعد البيانات –السنة الثالثة –هندسة احلاسبات والتحكم

23