108

تعليم اوراكل

Embed Size (px)

DESCRIPTION

شرح اوراكل بالعربى

Citation preview

Page 1: تعليم اوراكل
Page 2: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٢ -

البد منهاكلمة حنن نعيش يف عامل جديد حيكمه . لتحدي كبري واملسئولية هي مسئولية اجلميع ا

. عالةـنعيش يف عامل جديد قوامه قوى بشرية متعلمة، مدربة وف. واملعرفة العلمجديد أصبحت فيه املعايري كلها عاملية ، يف التعليم ، يف التدريب ، نعيش يف عامل

وى بشرية ـق قـدينا يف مصر ، وعن حـل. ياة ـي احلـل نواحـيف ك يف االقتصاد ، بلوة ـفقوة جمتمعنا من ق. ةبريـاقة شبابية كـط دينا يف مصرـائلة ، لــمتعلمة ه

.العصر وأساسياته شبابنا ، من تعليمه وتدريبه على آليات

ياسي ، يتوقف كثرياً على مدى قدرتنا ـتماعي والسـادي بل واالجصـتقدمنا االقتلى مدى قدرتنا ـثرياً عـف كـوقـابية ، يتـشرية الشبـقاء ذه القوة البـاالرت على

الذي يؤهلهم للحياة العملية املعاصرة الفرصة هلم للتدريب املتميز على إتاحةته بنفسه وإعطاؤه األمل يف قـادة ثـلى زيـنا عـتدرـدى قـلى مـع ثرياًـوقف كـ، يت

.املستقبل

.ا بكل إخالص ومحاسـهـيت نواجهـ الالدناـاه بـاجتهذه هي رسالتنا ومسئوليتنا .ولكن كما قلت املسئولية هي مسئولية اجلميع

لفلنعمل معاً مجيعاَ من أجل غداً أفضل ، من أجل جيل املستقب

مباركمجال

Page 3: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٣ -

: PL/SQLمقدمه عن أل* ويمكن استخدامها في العديد من المهام مثل عمل إجراءات أو Oracleهي إحدى اللغات المستخدمة في

ويتم استدعاء أوامر PL/SQL داخل لغة SQLالدوال على قاعدة البيانات حيث انه يتم إدخال جمل حيث أن داخل SQL وجمل ألPL خليط من PL/SQL لذلك يعتبر PL/SQLبسهوله داخل SQLأل

PL يتم التعامل مع جمل SQL بدون إعداد مسبق حيث في لغات البرمجة األخرى مثل VB يتطلب إلدخال داخلها استعمال SQLجمل

ذه تعتبر من نقاط القوه في وه SQL لتنفيذ أوامر أل EXEAUTEتعريفات معينه ثم نقوم باستعمال الدالة حيث تقوم SQLهذا الكود عبارة عن مجموعه من جمل أل ، وهو عبارة عن كود يتم كتابته PL/SQLأل

جمله وذلك ألنها تحتوي على إجراءات ومجموعه من ORACLE تقوم بدور مهم في أل PL/SQLأل

وهي تحتوي على مجموعه من PACKAGE وتحتوي على مكتبه هذه المكتبة هذه المكتبة تسمى اإلحداث اإلجراءات

ومجموعه من الدوال :PL/SQLوتوجد مميزات الستخدام جمل تستطيع التعامل مع األخطاء التي تظهر-١ تقوم بتعريف المتغيرات -٢ إلى أي بيئة أخرى غير بيئة االوراكل PL/SQL يمكن نقل البرنامج المكتوب بلغه -٣ بداخل كود واحدSQLمن جمل أل يمكن كتابه مجموعه -٤

: ويتكون هذا الكود من Block عبارة عن كود مكتوب هذا الكود يسمى PL/SQLوجمله ١- declaration : ويتم من خالل هذا الجزء تعريف ما يوجد داخل ألblock من متغيرات

variables ٢- executable command: كتوبة داخل يستخدم هذا الجزء لتنفيذ األوامر المcode وتعيين القيم

أو إجراءات أو دوال أو أحداث أو أشياء مثل ذلكSQLللمتغيرات واألوامر التي يتم كتابتها عبارة عن جمل ٣- exception handling :في هذا الجزء تتم التعامل مع األخطاء

طأ اليؤثر داخل الكود أي ال يحدث خ مثال إذا حدث خطأ معين ونريد هذا الخطأ نستخدم هذا الجزء من الكود

:Declaration من الكود وهو أوال الجزء األول تعريف ثمDeclare فيتم البدء بكلمه في هذا الجزء يتم تعريف المتغيرات المستخدمة داخل الكود

المتغيرات beginوينتهي هذا الجزء عند كلمه

وبعد هذه الكلمة يتم كتابه beginيبدأ بالكلمة :executable command من الكود وهو ثانيا الجزء الثاني الكود المطلوب

حيث انه في هذا الجزء يتم التعامل مع األخطاء : exception handling من الكود وهو ثالثا الجزء الثالث التي تحدث نتيجة لكتابه الكود

PL/SQLوبهذا نكون قد تعرفنا على محتويات جمله

:PL/SQL به بعض التعريفات الخاصة بواآلن سنقوم بكتا :PL/SQL األوامر بلوك-١

حيث انه يشمل اإلعالن عن المتغيرات والتعامل مع األخطاءPL/SQLهو الشكل المطلوب لكتابه أوامر : وهما وهي تنقسم إلى قسمان: البرامج الفرعية-٢١-Procedure :بال معامالت أو ال تستقبل هو برنامج عبارة عن مجموعه من األوامر تقوم باستق

أي تقوم بإرسال OUTأي بيعت له قيم ويمكن أن تكون المعامالت من النوع IN معامالت وتكون المعامالت Selectقيم إلى جمله

٢- function : هي عبارة عن مجموعه من السطور من األوامر لها اسم يمكن أن يستقبل معامالت ولكن البد أن يعيد قيمه

Page 4: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٤ -

وهي تحتوي على قسم functionوالدوال procedureهي تجميع لمجموعه من : package المكتبة-٣ package والبرامج الفرعية وكذلك قسم محتوى هذه الدوال وعند استعمالها يتم تحديد اسم أل تعريف الدوال

ثم اسم الدالة آو البرنامج الفرعي مالصقه لحدث من أحداث قواعد البيانات مثل هي مجموعه من األوامر التي تكتب:triggerالحدث -٤

Insert ,update ,delete لتنفيذ أوامر عند هذه العملية . بلوك pl/sqlل ما سبق يسمى بلوك

أقسام و هي ٣إلى مجموعة من البلوكات و تحتوى على أكثر من pl/sql و تقسم لغة أل *** و هو يحتوى على جميع المتغيرات و الثوابت و ريو هو جزء اختيا declarative جزء التعريف -١

. وهو يشير إلى الجزء التنفيذي وهذا الجزء اختياري اى يمكننا عدم وضعة المؤشرات و هو جزء ضروري جدا executable الجزء التنفيذي -٢

يانات في قاعدة التي تقوم بمعالجة الب sqlاى إجباري على المستخدم و يحتوى هذا الجزء على جمل أل البيانات

و هذا الجزء اختياري اى يمكننا وضعه أو عدم وضعه و هذا exception جزء االستثناءات -٣ يقوم بتصحيح األخطاء الموجودة في الكود الجزء

******************************** PL/SQL تركيب البرنامج في لغة أل

Declare جزء التعريف Variables , Cursor , user defined exception

Begin الجزء التنفيذي Sql – Statement Pl/Sql – Statement Exception جزء تصحيح األخطاء Action To Perform When Error Occur End ;

:pl/sqlواآلن سنقوم باعطاء شكل يوضح ما هو شكل الكود في ال

: أجزاء رئيسيه ٣ حيث انه يتكون من pl/sqlهذا المثال يوضح شكل الكود في بيئة أل

Page 5: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٥ -

ويستخدم تعريف المتغيرات declareالجزء األول وهو أل pl/sql ويستخدم هذا الجزء لكتابه كود beginالجزء الثاني وهو جزء أل

الجزء الثالث هو الجزء الخاص بمعالجه األخطاء التي تظهر نتيجة لكتابه الكود :إلى قسمان subprogrames وينقسم أل subprogrames ب pl/sqlفي أل blockيسمى أل

١-procedure: الستقبال بعض المعامالت والمعامالت هي عبارة جراء أو حدث يتم عملهوهو عبارة عن إ عن مجموعه من المتغيرات التي تأخذ قيمه أو تعطي قيمه للكود

٢-function :ولكن هي عبارة عن داله تقوم بحساب قيمه معينه وأيضا تقوم هذه الدالة باستقبال المعامالت هاالبد أن تقوم الدالة باسترجاع قيمه ل

مقدما functionوال procedure وسنقوم بدراسة كل من أل : مثال تجريبي

PL/SQL أو جمله SQLفي نهاية جمله أل ; يجب الوضع في االعتبار انه ال بد من وجود -١اى انه البرنامج ال يعرف نهاية الكود إال عند PL/SQLلكي تقوم بتشغيل الكود في جمله / استخدام -٢

وضع هذه العالمة أو اى أمر أخر PL/SQLالتي تمكنك بعدها بكتابه اى جمله (.) استخدام -٣

على العكس كلمه ;ال ينتهوا ب EXCEPTION , BEGIN , DECLAREالحظ أن الكلمات ** END يجب أن تنتهي ب ;

تكون مكتوبة في جزء PL/SQLو SQLهو عبارة عن مجموعه من جمل أل : البلوك EXCUTABLE و هذه الجملة تكون مهمة جدا في كودPL/SQL حيث انه بدون هذه الجملة ال

تشمل بلوك أو أكثر و هذه PL/SQL وحدة في أل اى أن اى و PL/SQLنستطيع أن نكون جمله , PROCEDURE ,FUNCTION ) البلوكات ممكن أن تنفصل عن األخرى و الوحدات االساسيه هي

SYNONYMOUS ) و أل SUBPROGRAMSب أل PROCEDURE , FUNCTIONو تعرف أل

SYNONYMOUS أل و تسمى بالبلوكات التي ليس لها اسم و هي التي تجعل PL/SQL بلوك منطقي و بلوك واحد يمكن أن يقدم جزء صغير من بلوك أخر و الذي يكون جزء إلى ممكن أن يحتوى على أرقام

. من وحدة كود كبيرة SYNONYMOUS هي البلوكات الغر مسماة و تدخل في التطبيقات بفاعليه SUBPROGRAM و هي تسمى بلوكات ألPL/SQL عامالت و ممكن أن تأخذ مPARAMETERS

عموما PROCEDURE , FUNCTIONو ممكن أن نحضرها من اى مكان أخر و ممكن أن تعرف ب

Page 6: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٦ -

في عمل اإلحداث PROCEDUREتستخدم أل في حساب القيم FUNCTIONو أل

على مستوى التطبيق أو على السير فر الخاص ب االوراكل SUBPROGRAMو يمكنك تخزين أل مقدما functionوال procedure سة كل من ألوسنقوم بدرا

يجب أن FUNCTIONمع اختالف أن أل PROCEDUREمشابه ل FUNCTIONمالحظه أل ** يسترجع قيم هو عبارة عن مجموعة من األوامر لها اسم تستقبل معامالت أو ال تستقبل PROCEDUREو تعريف أل

و تعيد قيد أو ال تعيد فهو عبارة عن مجموعة من السطور من األوامر لها اسم يمكن أن تستقبل معامالت و FUNCTIONأما

. لكن البد من أن تعيد قيم عند استدعائها

declareوأالن سنقوم بالتعرف على فائدة المتغيرات التي يتم كتابتها في جزء أل ** لماذا يتم استخدام المتغيرات ؟

:variable ألنه من فوائد المتغيرات يتم تخزين البيانات فيها حيث تعتبر هذه المتغيرات كأنها ذاكره مؤقتة-١ تستخدم أيضا هذه المتغيرات في الحسابات بدون الرجوع إلى قاعدة البيانات-٢ pl/sqlيتم استخدام هذه المتغيرات في أجزاء متعددة من كود -٣ ة في جدول أخر يمكن تعريف نوع المتغير معتمدا على نوع أعمده موجود-٤

:pl/sqlكيفيه التعامل مع المتغيرات في بيئة او procedure أو في pl/sqlفي أي جزء من أجزاء pl/sql يتم أوال تعريف المتغيرات في بيئة أل-١

functionونقوم باختيار نوع المتغير سواء كان رقم أو حروف أو تاريخ ٦لمتغير يبدأ بالقيمة يمكن إعطاء المتغير قيمه ابتدائية مثال ا-٢ : ومنهاpl/sqlيوجد أنواع من المعامالت أو المتغيرات داخل بيئة -٣

هذا المتغير أو المعامل البد من تحديد قيمه له عند استدعاءه : inمتغير من النوع • pl/sqlهذا المتغير يقوم بإرسال قيم إلى الكود المكتوب في لغة أل : outمتغير من النوع •هذا المتغير البد من تحديد قيم له وأيضا هذا المتغير يقوم بإرسال قيم إلى :in out النوع متغير من •

pl/sql الكود المكتوب في أل :والمتغير له أنواع من هذه األنواع ما يلي** ١-Scalar data type : ومعناها انه يأخذ نوع واحد من البيانات هذه البيانات إما رقمي أو حرفي أو

ي تاريخ٢-composite data type : وهو عبارة عن مجموعه من أنواع البيانات المختلفة البيانات الرقمية

والبيانات الحرفية والبيانات التاريخية مثل السجل حيث يحتوي السجل على جميع أنواع هذه البيانات٣-lob data type : ٤ في طولها إلى هذا النوع من البيانات يستخدم لتخزين بيانات طويلة قد تصل

من lobجيجابايت وتستخدم أيضا في تخزين الصور ذات المساحات الكبيرة ويوجد أنواع مختلفة من البيانات :هذه البيانات

**blob : نوع من أنواع البيانات حيث انه يقوم بتخزين البيانات على هيئه بيانات ثنائيه حتى يستطيع التعاملمثال يقوم بتحويل الصور إلى ملفات ثنائيه الصور و ملفات نصيه معها حيث انه وهذا النوع خاص ب

والملفات الثنائية هي عبارة عن ملفات لها امتداد معين يقوم االوراكل بالتعامل مع هذا (Binary) تسمى االمتداد لذلك يقوم بتحويل الصور إلى ملفات ثنائيه

**clob :لحروف أو البيانات الحرفية الكبيرة في المساحة والتي هي نوع من أنواع البيانات التي تتعامل مع ا جيجابايت حيث انه أيضا يتم تحويله إلى بيانات ثنائيه حتى يستطيع االوراكل التعامل معه٤يصل طولها إلى

**Bfile :هذا أيضا نوع آخر من أنواع البيانات هذا النوع من البيانات يتعامل مع ألfile أو مقاطع من ويتم أيضا تحويله إلى البيانات الثنائية حتى يستطيع االوراكل التعامل معهاmovieسلسالت أفالم أو م

٤-Boolean data type : وهي تختبر البيانات هل هي صحيحة أم خاطئة وتأخذ القيمtrueأو false : من هذه المتغيرات متغيرات تسمى pl/sqlوتوجد متغيرات أخرى ال تعتبر هذه المتغيرات من بيئة إل

Bind variable: هو عبارة عن متغير يتم تعريفه في جمله ألdeclare هذا المتغير يعاد استخدامه مره أخرى

Page 7: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٧ -

**Scaler data type : : ما في المثال اآلتيpl/sqlلتعريف المتغيرات في بيئة أل

المتغير األول وهو الرقم من النوع الرقمي وطول Declareفي هذا المثال تم تعريف المتغيرات في جزء Begin أرقام والمتغير الثاني هو االسم وهو من النوع الحرفي ثم في جزء أل ٨األرقام بداخله ال يتعدى

Scalar variable ويسمى هذا أيضا ب v_id ,v_nameنريد أن يضع بيانات الطالب داخل المتغيرات وذلك ألنه يحتوي على نوع واحد من البيانات أما رقمي آو حرفي أو تاريخي فالمتغير األول نوعه رقمي

Scalar variableوالمتغير الثاني نوعه حرفي لذلك يتم اعتبارهم هل المتغير ممكن أن يوجد بداخله قيمه خاليه وإذا حدث إجراء أي عمليه حسابيه على القيم ولكن السؤال

الخالية كيف سيتم التعامل مع القيم الخالية القيم الخالية هي عبارة عن قيم ال تساوي الصفر ولكن هي عبارة عن قيم غير موجودة أي لم يتم إدخال قيم

:القيم كما يليلهذا الحقل ويتم التعامل مع هذه Null فعند جمه أو طرح أو ضرب أي قيمه في (*)أو) –(أو (+) إذا تم تطبيق العمليات الحسابية مثل-١

ترجع null الناتج يكون مساوي للقيمة x+y عند عمل العملية الحسابية y=5 وx=null فمثال لو لدينا nullبالقيمة

Nullأي انه في العمليات الحسابية يرجع بالقيمة x= null فمثال لو لدينا المتغير Null فإنها أيضا ترجع بقيمه Ifعند تطبيق عالمات المقارنة مثل -٢

Null= يكون الناتج if x!=y مثل yو xعلى If وعند تطبيق الدالة y=5والمتغير تج أيضا قيمه خاليه مع القيم الخالية يكون الناOr أو المعامل Notأو المعامل Andعند استخدام المعامل -٣

مع القيم الخاليةANDأوال استخدام المعامل

ANDالمعامل TRUE القيمة FALSE القيمة NULLالقيمة NULLالناتج

الناتج يظهر ولكن خالي من القيم

FALSEالناتج الناتج ال يظهر

TRUEالناتج الناتج يظهر

TRUEالقيمة

FALSEالناتج الناتج يظهر

FALSEالناتج الناتج ال يظهر

FALSEالناتج الناتج ال يظهر

FALSEالقيمة

NULLالناتج الناتج يظهر ولكن

FALSEالناتج الناتج يظهر

NULLالناتج الناتج يظهر ولن

NULLالقيمة

Page 8: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٨ -

يكون خالي من قيم خالي من القيم

مع القيم الخالية OR ثانيا استخدام المعامل

ORالمعامل FALSE القيمة NULLالقيمة TRUEالناتج

الناتج يظهر TRUEالناتج

الناتج يظهر TRUEالناتج

الناتج يظهر TRUEالقيمة

FALSEالناتج الناتج يظهر

FALSEالناتج الناتج ال يظهر

TRUE الناتج الناتج يظهر

FALSEالقيمة

NULLالناتج الناتج يظهر ولكن

خالي من القيم

NULLالناتج ظهر وان الناتج ي

خالي من القيم

TRUEالناتج الناتج يظهر

NULLالقيمة

ولكن هل يوجد طريقه أخرى لتعريف المتغيرات أو طريقه أخرى لمعرفه أنواع البيانات دون كتابه كل نوع البيان المطلوب ومعناها انه يريد نفس نوع البيان سواء كان رقمي او حرفي او تاريخيType%يمكن استخدام

:Type%على استخدام مثال

ومعناها نفس نوع البيان فمثال هذا المثال تالحظ أن Type%في هذا المثال تم تعريف المتغيرات باستخدام الموجود في جدول الطالب حيث أن نوع stud_idع البيان للعمود أرقام الطالب هو نفس نوIdالمتغير

البيان في عمود أرقام الطالب من النوع الرقمي لذلك يأخذ هو أيضا هذا النوع من البيانات وهو الرقميوع ويوجد متغير أخر وهو االسم يأخذ أيضا نفس نوع البيانات الموجودة في عمود أسماء الطالب وهي الن

.type%الحرفي وهذه هي فائدة استخدام :مثال

Page 9: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٩ -

طالب وھو رقم الطالب ونرید من الجدول أرقام الStud_idفي ھذا المثال تم تعریف متغیر ھذا المتغیر اسمھ أي ھو نفس اسم المتغیر وھذا یؤدي إلى تضارب وینتج خطأ معناه انھ یوجد صفوف stud_idوھذا العمود اسمھ

كثیرة تأتي من الجدول ولحل المشكلة للتداخل بین األسماء :نتبع اآلتي

Page 10: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٠ -

قبل اسمھ وھذا یؤدي الى االختالف بین اسم العمود واسم vفي ھذا المثال تم تغییر اسم المتغیر بوضع الحرف

المتغیر ویؤدي إلى نجاح العملیة یمكن التعامل معھ pl/sqlولكن إذا حدث خطأ عند كتابھ الكود في أل

:مثل ھذا المثال

انھ یوجد أسماء كثیرة تأتي من جدول الطالب معنى ھذا الخطأ : المثال األتي نرى ولكن إذا أردنا معالجھ ھذا الخطأ

في ھذا المثال تم معالجھ الخطأ الذي ظھر سابقا وھو انھ یوجد عدد كبیر من األسماء تأتي من الجدول فیتم كتابھ

طأ الذي یظھر الخ thenو whenالذي یستخدم في معالجھ األخطاء ثم نكتب بین Exceptionجزء أل ثم نكتب جملھ تحل ھذا الخطأ وھي مثال جملھ طباعھ مثل الجملة السابقة وبھذا نكون قد عالجنا األخطاء

ومن الممكن أن تحتوي على عالمات Sqlهو عبارة عن مجموعه من جمل أل Pl/sqlالكود داخل أل ات البسيطة وتوجد أيضا العمليات المعقدة وتسمى هذه العمليات بالعملي(=,/,*,-,+)حسابيه من هذه العالمات

pl/sql وكل هذه العمليات يتم استخدامها داخل جمل أل (=:,/*,*/,=!,||,<>)مثل هذا الجزء يستخدم في تعريف declareوهو جزء أل pl/sqlويوجد جزء التعريفات في جمله أل

:م هذا الجزء وهي المتغيرات كما تم معرفته سابقا ولكن توجد شروط عند استخدا حرف ٣٠المتغير ممكن أن يصل طول الكلمة إلى أكثر من -١ يجب أن يبدأ المتغير بحروف أبجديه وليس أرقام أو عالمات خاصة-٢

Page 11: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١١ -

ال يجب أن نختار اسم المتغير يكون هذا االسم موجود كاسم عمود في الجدول حيث انه يحدث تضارب -٣ بين اسم العمود واسم المتغير

) spaceأو _ أو $ ( من الممكن أن يكتب داخل المتغير العالمات-٤ single quotationعندما نعطي للمتغير قيمه هذه القيمة عبارة عن حروف توضع هذه الحروف بين-٥

(' ') ولكن األرقام ال توضع بين (' ') انه بدون كتابه هذه العالمة ال يتم في أخر الجملة لعمل تشغيل الكود المكتوب حيث(/) يتم استخدام أل -٦

تشغيل الكود pl/sqlولكن في أجزاء أخرى من جمل

Host variable :ھو عبارة عن متغیر یستخدم في جملھ أل declear أوال ثم یعاد استخدامھ مره أخرى في العالمة وھذه(:) مره أخرى یتم وضع executable block فعند استخدامھ في executable blockجزء

Host variableتوضع قبل المتغیر وھذه العالمة تدل على انھ مع إجراء عملیات أل Sqlالتي یتم استخدامھا في أل Selectولكي نأتي بالبیانات من الجدول نستخدم جملھ أل

Insert وUpdate و Delete كما نفعل في ألSql :وأالن سنقوم بتوضيح مثال للمتغيرات

:ولكن إذا أردنا إظھار المتغیر الذي بھ الناتج نتبع كما في المثال اآلتي

Page 12: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٢ -

ثم اسم المتغير نالحظ انه Printفي هذا المثال إذا أردنا إظهار المتغير الذي يحتوي على الناتج نكتب الجملة في المتغير١يظهر اسم الطالب رقم

كان اسم المتغیر ھو نفسھ یجب ان یكون اسم المتغیر مختلف عن اسم االعمده الموجودة في الجدول وذلك ألنھ إذا ھذا التضارب بسبب أن اسم المتغیر ھو نفسھ اسم العمودpl/sqlاسم العمود فھذا یؤدي إلى تضارب في جملھ أل

:مثال

وھو رقم الطالب ونرید من الجدول أرقام الطالب Stud_idمثال تم تعریف متغیر ھذا المتغیر اسمھ في ھذا ال أي ھو نفس اسم المتغیر وھذا یؤدي إلى تضارب وینتج خطأ معناه انھ یوجد صفوف stud_idوھذا العمود اسمھ

كثیرة تأتي من الجدول :ولحل المشكلة للتداخل بین األسماء نتبع اآلتي

Page 13: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٣ -

قبل اسمھ وھذا یؤدي الى االختالف بین اسم العمود واسم vفي ھذا المثال تم تغییر اسم المتغیر بوضع الحرف المتغیر ویؤدي إلى نجاح العملیة

یمكن التعامل معھ pl/sqlدث خطأ عند كتابھ الكود في أل ولكن إذا ح :مثل ھذا المثال

Page 14: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٤ -

انھ یوجد أسماء كثیرة تأتي من جدول الطالب معنى ھذا الخطأ

: المثال األتي نرى ا أردنا معالجھ ھذا الخطأولكن إذ

فیتم كتابھ في ھذا المثال تم معالجھ الخطأ الذي ظھر سابقا وھو انھ یوجد عدد كبیر من األسماء تأتي من الجدول الخطأ الذي یظھر thenو whenالذي یستخدم في معالجھ األخطاء ثم نكتب بین Exceptionجزء أل

ثم نكتب جملھ تحل ھذا الخطأ وھي مثال جملھ طباعھ مثل الجملة السابقة وبھذا نكون قد عالجنا األخطاء الممكن أن تحتوي على عالمات ومنSqlهو عبارة عن مجموعه من جمل أل Pl/sqlالكود داخل أل

وتسمى هذه العمليات بالعمليات البسيطة وتوجد أيضا العمليات المعقدة (=,/,*,-,+)حسابيه من هذه العالمات pl/sql وكل هذه العمليات يتم استخدامها داخل جمل أل (=:,/*,*/,=!,||,<>)مثل

هذا الجزء يستخدم في تعريف declareوهو جزء أل pl/sqlويوجد جزء التعريفات في جمله أل :المتغيرات كما تم معرفته سابقا ولكن توجد شروط عند استخدام هذا الجزء وهي

حرف ٣٠المتغير ممكن أن يصل طول الكلمة إلى أكثر من -١ يجب أن يبدأ المتغير بحروف أبجديه وليس أرقام أو عالمات خاصة-٢كون هذا االسم موجود كاسم عمود في الجدول حيث انه يحدث تضارب ال يجب أن نختار اسم المتغير ي-٣

بين اسم العمود واسم المتغير ) spaceاو _ او $ ( من الممكن أن يكتب داخل المتغير العالمات-٤ single quotationعندما نعطي للمتغير قيمه هذه القيمة عبارة عن حروف توضع هذه الحروف بين-٥

(' ')قام ال توضع بين ولكن األر(' ')في آخر الجملة لعمل تشغيل الكود المكتوب حيث انه بدون كتابه هذه العالمة ال يتم (/) يتم استخدام أل -٦

تشغيل الكود

**Scalar data type :

: ما في المثال اآلتيpl/sqlلتعريف المتغيرات في بيئة أل

Page 15: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٥ -

ول وهو الرقم من النوع الرقمي وطول المتغير األDeclareفي هذا المثال تم تعريف المتغيرات في جزء Begin أرقام والمتغير الثاني هو االسم وهو من النوع الحرفي ثم في جزء أل ٨األرقام بداخله ال يتعدى

Scalar variable ويسمى هذا أيضا ب v_id,v_nameنريد أن يضع بيانات الطالب داخل المتغيرات إما رقمي أو حرفي أو تاريخي فالمتغير األول نوعه رقمي وذلك ألنه يحتوي على نوع واحد من البيانات

Scalar variableوالمتغير الثاني نوعه حرفي لذلك يتم اعتبارهم ولكن هل يوجد طريقه أخرى لتعريف المتغيرات أو طريقه أخرى لمعرفه أنواع البيانات

في جدول الطالب لهذا المتغير ومعناها انه يريد نفس نوع البيانات الموجودة مثالType%يمكن استخدام

:Type%مثال على استخدام

ثال تالحظ أن ومعناها نفس نوع البيان فمثال هذا المType%في هذا المثال تم تعريف المتغيرات باستخدام

الموجود في جدول الطالب حيث أن نوع stud_id هو نفس نوع البيان للعمود أرقام الطالب Idالمتغير البيان في عمود أرقام الطالب من النوع الرقمي لذلك يأخذ هو أيضا هذا النوع من البيانات وهو الرقمي

Page 16: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٦ -

جودة في عمود أسماء الطالب وهي النوع ويوجد متغير أخر وهو االسم يأخذ أيضا نفس نوع البيانات المو .type%الحرفي وهذه هي فائدة استخدام

Boolean data type: :Booleanلتعريف المتغيرات التي تأخذ صح أو خطأ إي يكون نوعها

True خطأ والمتغيرات دائما ترجع إماFalse صحيح أو True انه يساوي أما Booleanمعنى كلمه Nullأو ترجع قيمه ب خطأ Falseصحيح أو

:مثال

وقد تم معرفه معنى كلمه Boolean ونوعه من النوع V_checkفي هذا المثال تم استخدام المتغير Booleanرجع صح أو خطأ ففي هذا المثال إذا كان ثمن قيمه الدورة اكبر من رقم الدورة ومعناها إما ي

False وإال يرجع ب Trueيرجع هذا المتغير ب :Composite data type

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

Composite data type :مثال

إلنشاء السجل أوال

Page 17: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٧ -

وهو عبارة عن سجل يحتوي على بيانات Stud_record_type جديد يسمىفي هذا المثال تم عمل سجل متعددة مثل الحروف واألرقام والتواريخ والبد أن نعرف السجل على انه متغير ونوعه عبارة عن سجل

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

:مثال

الذي تم تكوينه في المثال السابق بأخذ كل أنواع stud_recordفي هذا المثال تم تعريف نوع المتغير Rowtype%البيانات الموجودة في الجدول سواء كانت حرفيه أو رقميه أو تاريخيه ولذلك تم استخدام

:إذا أردنا كتابه تعليق على الكود بداخله مثال :للتعليق نوعان

وهذه ) --(لنوع األول أن التعليق عبارة عن سطر ولكي نوقف عمل التعليق نضع في بداية السطر ا-١ العالمة معناها إيقاف عمل التعليق

Page 18: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٨ -

النوع الثاني وهو أن يتكون التعليق من أكثر من سطر وإليقاف تشغيل هذا التعليق نستخدم العالمة-٢ ليقوعنى هذه العالمة إيقاف تشغيل التع */) (/*

:مثال على ذلك

)--(ولكن تم وقف هذا التعليق باستخدام العالمة(this is my name) في هذا المثال تم عمل تعليق يسمى

: في أكثر من سطرمثال أخر يوضح كتابه التعليق

ولكن تم وقف عمل هذا التعليق بوضع العالمة pl/sqlفي هذا المثال تم عمل تعليق على الكود المكتوب أل يل التعليق والن التعليق أكثر من سطر لذلك نستخدم هذه العالمة وهي تعني إيقاف تشغ */) (/*

) --(أما إذا كان التعليق يحتوي على جمله واحده فنضع العالمة : من هذه األشياء PL/SQLتوجد بعض األشياء المسموح بكتابتها في لغة أل

(To_char,To_date,To_number)دوال التحويل وهي -١ (Lower, Upper ,Initcape,concatenate)بق على الحروف الدوال التي تط-٢ الدوال التي تطبق على األرقام-٣ (Monthes_between, Add_monthes,Next_day,Last_day)الدوال التي تطبق على التاريخ-٤

Page 19: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٩ -

:Pl/sqlوتوجد أيضا بعض األشياء الغير مسموح بها في لغة Decodeاستخدام الدالة -١ (Max ,Min,Avg,Count,Sum)ل المجمعة مثل استخدام الدوا-٢

:pl/sqlمثال على استخدام الدوال في جمل أل

يث أنها تستخدم للربط بين الحروف آو أسماء ح(sql)وهي من دوال أل) ||(في هذا المثال تم استخدام الدالة

االعمده (pl/sql)مثال آخر يبين استخدام الدوال في جمله أل

ي تستخدم في تحويل الحروف الى حروف كبيرهالت Upperفي هذا المثال تم استخدام الدالة (pl/sql)وبهذا يتم استخدام الدوال في لفه أل

عند استخدام قيمه هذه القيمة ال تتساوى مع القيم الموجودة في الجدول من ناحية شكل الرقم أو شكل التاريخ

(To_char,To_number,To_date)نستخدم دوال التحويل وهي :pl/sql دوال التحويل في جمل أل مثال على استخدام

Page 20: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٢٠ -

هذا المثال اظهر هذا الخطأ ألنه ال يوجد هذا الشكل من األرقام في الجدول لذلك نستخدم دوال التحويل وهي ألنها تستخدم في تحويل األرقام والتاريخ (To_char)الدالة

:ولمعالجه هذا الخطأ كما في المثال األتي

م عمود تليفون الطالب إلى هذا الشكل من األرقام كما لتحويل أرقاTo_charفي هذا المثال تم استخدام الدالة

هو موضح بالشكل pl/sqlوبذلك تم استخدام دوال التحويل في جمل أل

PL/SQL BLOCK SYNTAXكيفيه بناء البلوك **

حرف ٣٠ممكن أن تحتوى على أكثر من • " "ال يمكنك وضع الكلمات المحجوزة إال إذا وضعناها في • ى على حرف ابجدى البد أن تحتو • في قاعدة البيانات ال تختار نفس االسم المطابق ألسم الحقل للجدول الموجودة •

Page 21: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٢١ -

لوضع بعض التعليقات في الكود ** سطر واحد إذا كانت التعليق-- ٢نبدأ السطر ب

*/ ة و فى البداي*/ و إذا كان التعليق يحتوى على يحتوى على سطور كثيرة فنقوم بوضع التعليق بين في النهاية

: PL/SQL في أل FUNCTIONSالدوال ** مثل PL/SQLو تكون مسوحه في أل SQLمعظم الدوال تكون المسموحه في

• SINGLE –ROW NUMBER FUNCTIONS • SINGLE – ROW CHARACTER FUNCTIONS • DATATYPE CONVERSION FUNCTION • DATE

: و تكون غير مسوحه في

• DECODE • GROUP FUNCTION (AVG , SUM , MIN , MAX,STDDEV )

:تحويل أنواع البيانات **

ممكن أن تحول البيانات إلى اى نوع بيان آخر • اختالط أنواع البيانات ممكن أن يعطى أخطاء وهذا له تأثير • دوال التحويل •

TO_CHAR TO_DATE

TO_NUMBER

Nested Block البلوكات المتداخلة يوجد أيضا في لغة Subquary وكانت تسمى ب Sql في Selectداخل جمله Selectمثلما تم كتابه جمله

pl/sql كتابه بلوك داخل بلوك وهذا يسمى ب Nested blocksت المتداخلة ويتم التداخل بين البلوكا

Page 22: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٢٢ -

أي الجزء الذي يتم كتابه الكود فيه وتصبح كلها كجمله واحده أو بلوك Executableالبلوكات في جزء أل وهو جزء معالجه األخطاء Exception في جزء Nested blockواحد ويمكن أيضا كتابه

وهي عبارة عن متغيرات يتم variable scopeمى والمتغيرات التي يتم استعمالها في البلوكات المتداخلة تسويتم استخدام نفس Declare في البلوك األول في جزء أل (z)استخدام احد هذه المتغيرات وليكن المتغير

وهذا ما يسمى ب executable sectionهذا المتغير في البلوك الثاني ولكن هذه المرة في جزء أل variable scope

(Child) ال يرى اي متغير من البلوك الفرعي (Parent)بلوكات المتداخلة البلوك الرئيسي ونالحظ في ال :مثال على استخدام البلوكات المتداخلة

ويحتوي البلوك الخارجي على كود خارجي Outer بلوك أوال البلوك الخارجي وهو ٢ في هذا المثال تم عمل وهذا البلوك يحتوي على متغير رقم الطالب ومتغير ثمن End وbegin و declareهذا الكود مكون من

معرفه قيمهExecutable sectionالدورة ورقم الدورة ومتغير الختبار هذه المتغيرات ونريد في جزء أل وهو عبارة عن قيمه المتغير ثمن الدورة مرتبطة مع رقم الدورة v_check المتغير

وهو عبارة عن بلوك هذا البلوك موجود داخل (Inner block)البلوك الثاني هو البلوك الداخلي ويسمى ويحتوي على المتغيرات رقم End وbegin و declareالبلوك األصلي ويحتوي هذا البلوك أيضا على

وهو عبارة عن p_check ونقوم بحساب المتغيرP_checkطالب وتاريخ ميالد الطالب وأيضا المتغير ال معناها رقم الطالب الموجود خارج Outer.v_stud_id ومعنى أل متغير رقم الطالب ومتغير رقم الدورة

(Inner block) :ولكن إذا أردنا معرفه مثال نتائج المتغيرات السابقة

الخارجي أي الموجود في البلوك األول v_checkردنا معرفه قيمه المتغير إذا أ-١ v_check=10||20:تكون قيمه هذا المتغير هي

(Inner) حيث أنها تتبع البلوك الثاني وهو Outer. V_stud_id=10*200إذا أردنا معرفه قيمه المتغير -٢

Page 23: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٢٣ -

:ملحوظة و موجود في البلوك الخارجي فمثال في حاله نالحظ في هذا الكود أن البلوك الداخلي يرى ما ه

Outer. V_stud_idنالحظ انه يرى قيمه رقم الطالب من الرقم الموجود في البلوك الخارجي PL/SQL OPERATORS INالعمليات في أل **

• LOGICAL • ARTHMETIC • CONCATENATION • PARENTHESES TO CONTROL ORDER OF OPERATIONS • EXPONENTIAL OPERATOR (**)

العملية الوصف NOT , ** دليل و إنكار

- , + تتطابق و عدم تتطابق / , * الضرب و القسمة

|| , - , + االضافه و النقصان و الربط IS NULL , LIKE ,BETTWEEN , IN ,=<,=>,<,>,=!,= عمليات المقارنة

AND التوحيد OR أو

بعض العملياتأمثله على SEQUENCEلعمل عداد متسلسل مثل

١ بمقدار العداد إلى إضافة اى + و ذلك باستخدام العملية

IS NOT NULLاستخدام العملية تساوى و العملية

Page 24: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٢٤ -

: identifiersكيفيه تمييز التعريفات في هذا الجدول سوف نقوم بوضع التعريف و الحرف أو الكلمة التي تشير إلى هذا التعريف

مثال التي تشير إليهالكلمة التعريفVariable V_name V_sal Constant C_name C_company_name

Cursor Name_cursor Emp_cursor Exception E_name E_too_many Table type Name_table_type Amount_table_type

Table Name_table Order_total_table Record type Name_record_type Emp_record_type

Record Name_record Customer_record Sql*plus substitution variable ( referred to

substitution parameter )

P_name P_sal

Sql*plus global variable (it's referred to bind

variable)

G_name G_year_sal

ـــــــــــــــــــــــــــ ـــــــــــــــــــــــــــــــــــــــــــــــ

PL/SQL في أل SELECTعمليه استخدام عبارة أل **

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

PL/SQL ارة كما يمكنك القيام باستخدام عب SELECT لكي تقوم بإعطاء المتغيرات قيم

Page 25: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٢٥ -

PL/SQLو SQL يمكننا عمل مقارنه بين فالنPL/SQL SQL

أوامر السيطرة على البيانات ال يوجد بها · TRANCSACTION CONTROL

مثل COMMIT , ROLLBACK , SAVEPOINT

يوجد بها أوامر السيطرة على البيانات ·TRANCSACTION CONTROL

(DDL) ال يوجد بها لغات التعريف بالبيانات ·DATA DEFINITION LANGUAGE

:مثل CREATE TABLE

ALTER TABLE DROP TABLE

يوجد بها لغات التعريف بالبيانات ·(DDL )

DATA DEFINITION LANGUAGE

(DCL)ت ال يوجد بها لغة التحكم بالبيانا ·DATA CONTROL LANGUAGE

مثل GRANT , REVOKE

يوجد بها لغة التحكم بالبيانات ·(DCL)

DATA CONTROL LANGUAGE

PL/SQLفي أل SQLعبارات

SQLاسترجاع البيانات من البيانات باستخدام عبارات PL/SQLداخل أل SQLالصيغة االساسيه الستخدام

SELECT SELECT_LIST INTO { VARIBALE_NAME , [ VARIABLE_NAME] ,……. | RECORD_NAME ] FROM TABLE WHERE CONDITIONS ;

SELECT_LIST و هي مجموعة من األعمدة أو على األقل عمود واحد VARIABLE_NAME : اسم المتغير

RECORD_NAME : اسم السجل TABLE_NAME : يشير إلى قاعدة البيانات اسم الجدول الذي

CONDITION : تحتوى على أسماء األعمدة و التعبيرات و العمليات و المتغيرات و الثوابت الPL/SQL

و SELECT .. FROMو تكون بين SELECTجزء اجبارى في جمله أل INTOاستخدام كلمه ان تعطى متغير لكل عمود قمت ويجب SQLتستخدم في تعيين أسماء المتغيرات السترجاع القيم من

باالستعالم عنة : مثال

Page 26: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٢٦ -

; ب SQLو يجب التأكد من إنهاء عبارات

و PL/SQLداخل WHEREستخدم عبارة و يمكن أن ن SELECTداخل جمله أل INTOو نستخدم ذلك لتعيين المتغيرات و التعبيرات و الثوابت لألعمدة

: مثال :استرجاع اجمالى المرتبات لكل الموظفين الموجودين في القسم الذي تختاره

PL/SQLفي أل DATA MANIPULATON LANGUAGE (DML)استخدام **

مثل (DML)يمكننا التغيير في جداول قاعدة البيانات باستخدام أوامر

• INSERT إلضافة صف جديد من البيانات في الجدول • UPDATE تعديل صف من البيانات الموجدة في الجدول • DELETEصفوف الغير مطلوبة في الجدول حذف ال

insert أوال مثال إلضافة بيانات في الجدول و ذلك باستخدام عبارة و هذا المثال يقوم بإضافة موظف جديد في جدول الموظفين

Page 27: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٢٧ -

update في الجدول و ذلك باستخدام عبارة تعديل البيانات الموجودة: ثانيا

جنيه إلى مرتبات جميع الموظفين الموجودين في قاعدة البيانات ٣٠٠٠في هذا المثال سوف نقوم بإضافة ANALYSTو تكون وظيفتهم

DELETE حذف البيانات الموجودة في الجدول و ذلك باستخدام عبارة :ثالثا

سماء المتغيرات و أسماء األعمدة في الجدولتداخل بين أ**

Page 28: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٢٨ -

ال يصح أن نعطى متغير اسم هذا االسم يكون مستخدم كاسم عمود في الجدول الن هذا يؤدى إلى تضارب بين اسم العمود و اسم المتغير

بين األسماء و هذا المثال يوضح هذا التضارب

TRANCSACTION CONTROL استخدام أوامر السيطرة على البيانات*

: COMMITأوال استخدام أمر الحفظ

ثانيا استخدام أمر الحفظ باسم على هذا التعديل

Page 29: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٢٩ -

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

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

Page 30: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٣٠ -

pl/sql CONTROLLING PL/SQL FLOW OF EXECUTIONالتحكم هياكل البيانات أل الممكن أن وقمنا بكتابه هذا الشرط فمنpl/sqlإذا أردنا أن نطبق شرط معين على الكود المكتوب في أل

يكون االجابه إما صحيحة أو خاطئة وربما هذا الشرط نريده أن يتكرر في أكثر من كود هذا التكرار للشرط على مجموعه من الصفوف في الجدول فيتم أننا نريد تكرار شرطloop حيث أن فكره أل loopيسمى ب

while استخدام case بحاالته واستخدام األمر ifاستخدام أوامر معينه من هذه األوامر استخدام األمر : هذه األوامر سنتناولها بالتفصيل فيما يليforواستخدام

:If_then_end _Ifاستخدام : أوال كتوب نفذ الجملة التي تليه معناها انه لو حدث الشرط الم Ifالدالة

:والصيغة العامة لها هي If الشرط المراد اختبارهThenالجملة المراد كتابتها elsifالشرط المراد اختباره then الشرط المراد كتابته

Elseالجملة المراد كتابتها End if;

الموجودة بعد الكلمة ومعناها انه يختبر الشرط أوال إذا كان الشرط صحيح يكتب هذه الجملة Then أما إذا إذا كان صحيح نكتب الجملة Elsifكان الشرط غير صحيح فنقوم باختبار الشرط الموجود في األمر

أما إذا كان الشرط غير صحيح نقوم بكتابه الجملة Elsifالموجودة في األمر Then الموجودة بعد كلمه Elseالموجودة بعد الكلمة :مثال توضيحي لذلك

فقط then مع ifأوال استخدام

Page 31: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٣١ -

ا لم علي أما إذ= نكتب الشرط وهو المتغير اسم الطالب ٥هذه الجملة معناها إذا كان رقم المتغير اكبر من

Ifوائل وتم إنهاء جمله أل = نكتب اسم الطالب ٥يتحقق الشرط وهو أن رقم الطالب اقل من أو يساوي End ifبجمله

:كما في المثال اآلتي Printولكي نرى الناتج الذي يظهر نستخدم األمر

Endفي هذا المثال تم طباعه المتغير اسم الطالب ونالحظ في الناتج انه تم تطبيق جمله الشرط الموجودة في

Endوينفذ جمله IF لذلك ال ينفذ جمله ٥وذلك الن رقم الطالب ليس اكبر من إذا لو حدث هذا الشرط وعمناهاElsif على IFمن الممكن أن تحتوي جمله أل أمر

IF في جمله Elsifواآلن سنعطي مثال على استخدام

Page 32: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٣٢ -

يكون اسم ٥=ان رقم الطالب ومعنى هذا الكود لو كIF في جمله أل ELSIFفي هذا المثال تم استخدام الدالة

يكون ٦= وهي معناها وإال إذا كان رقم الطالب ELSIF ولكن لو هذا خطأ يقوم بتنفيذ عبارة modyالطالب WEWE وإذا كان ذلك خطأ أيضا نكتب اسم الطالب MADYاسم

لكي نرى ما يوجد داخل المتغير نالحظ المثال األتي

لم يتحقق فيتم elsif وIFنالحظ في الناتج انه تم طبع اسم الطالب وائل الن الشرط الموجود في جمله ال

ELSEتطبيق جمله :استخدام شرطين متداخلين مثال IFمن الممكن داخل جمله

Page 33: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٣٣ -

في هذا المثال تم تعريف المتغيرات وهي الرقم واالسم والعنوان ورقم الطالب واسم الطالب ثم استخدامنا ٥=رطين الشرط األول هو رقم الطالب رقمه الختبار شرط معين ولكن هذا الشرط مكون من شIF األمر

الذي تم شرحه سابقا في andوالشرط الثاني أن يكون اسم الطالب وتم الربط بين الشرطين باستخدام المعامل Sql والمعامل and معناه انه البد من أن يتحقق الشرطان السابقان معا وال يتحقق شرط والشرط الثاني ال

التي تحتوي على العنوان thenنا انه لو تحقق الشرطان السابقان يتم تنفيذ جمله ه ifيتحقق ومعنى جمله Giza وإال إذا كان الشرطان غير متحققان يتم تنفيذ جمله Else التي بها العنوان tanta ثم ننهي جمله if ب

End if مثال

: IF الشروط المتداخلة في جمله آخر الستخدام

Page 34: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٣٤ -

!خطأ

بدال من ORهذا المثال هو نفس المثال السابق ولكن االختالف الوحيد في هذا المثال انه تم استخدام المعامل ليس شرطا أن يتحقق ORمعامل هو في الAND والمعامل OR واالختالف بين المعامل ANDالمعامل

الشرطان ولكن من الممكن أن يتحقق شرط واألخر ال يتحقق ومع ذلك يتم تنفيذ الشرط بالرغم من عدم تحقق احمد = واسم الطالب ٥=الشرطان معا ونالحظ ذلك في المثال السابق حيث أن الشرط األول هو رقم الطالب

ELSEا لم يتحقق هذا الشرط نقوم بتطبيق جمله وإذTHENفإذا تحقق هذا الشرط نطبق جمله IFمكتوبة داخل جمله IF متداخلة أي معناها جمله IFمن الممكن أن يحتوي الكود المكتوب على جمله

:مثال على ذلك

Page 35: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٣٥ -

مرتين المرة األولى معناها لو عنوان الطالب هو طنطا اجعل رقم الطالب IFفي هذا المثال تم استخدام جمله

ننهي أوال الجملة الثانية ب IF ونقوم بإنهاء جمل ٦ رقم الطالب وأال لو عنوان الطالب هو الجيزة اجعل٥ End if األولى ثم ننهي الجملة الثانية بEnd if الثانية

يتم التحكم في مسار البرنامج أو جعل البرنامج ينفذ عمليات معينه فقطIFباستخدام الدالة : ملحوظة** هي الوحيدة التي تتحكم في سير البرنامج ولكن يوجد داله أخرى تستخدم للتحكم في IFولكن ليست األمر

ولكن الصيغة تختلف عن صيغه IFلدالة وهي أيضا لها نفس استخدام اCASEسير البرنامج مثل األمر انه يقوم بإعطاء متعددة للمتغير CASEوفائدة األمر CASE واآلن سنرى كيفيه استخدام األمر IFالدالة

: هيCASEمن خاللها يتم من خاللها االختيار بين القيم والصيغة العامة لألمر CASEاسم المتغير الذي له قيم متعددة

WHEN الشرط المطلوب اختباره THEN هذا الشرط الناتج من تطبيق WHEN الشرط المطلوب اختباره THENالناتج من تطبيق هذا الشرط

..

..

.. ELSEناتج أخر

END; :CASEمثال الصيغة العامة الستخدام األمر

عندما يتم كتابته في الكودCaseهذه هي شكل األمر :Caseمثال لتطبيق األمر

Page 36: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٣٦ -

تم أوال تعريف متغير ثمن الدورات من النوع الرقمي ثم نعرف Case في المثال السابق تم استخدام األمر ١٠٠٠= ومعناه انه لو ثمن الدورة Caseمتغير من النوع الرقمي وهو رقم الدورة ثم نكتب في الكود األمر

ولو ثمن الدورة ٢٠* اضرب ثمن الدورة في ١٥٠٠ وإذا كان ثمن الدورة ١٠*لذلك اضرب ثمن الدورة ٤٠* وإال إذا كان غير ذلك اضرب ثمن الدورة في ٣٠* ثمن الدورة في اضرب٢٠٠٠

:Caseمثال آخر يوضح استخدام األمر

المتغير Caseف الوحيد في هذا المثال انه ال يوجد بعد األمرهذا المثال هو نفس المثال السابق ولكن االختال

أي انه ليس شرطا Whenالذي سيعطى له القيم المختلفة وتم وضع المتغير الذي يأخذ قيم مختلفة بعد كلمه اسم المتغير وهذا هو االختالف بين المثال السابق والمثال الحاليCaseأن نكتب بعد كلمه متغير لكي نرى الناتج لل

Page 37: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٣٧ -

على المتغير يظهر هذا الناتجCase وبعد تطبيق األمر تم طبع المتغير الذي يحتوي على بيانات متعددة

١٠*١٠٠٠وهو ناتج من ضرب قيمه الدورة

:الجمل التكرارية

جمل تكراريه ومعنى الجمل التكرارية هي عبارة عن جمل يتم تكرارها داخل PL/SQLيوجد داخل جمل أل الكود حيث أنها تتكون من مجموعه من األوامر التي تتكرر ويتم التحكم في تشغيل أو إيقاف هذه األوامر عن

:أنواع من الجمل التكرارية ويوجد ثالثة LOOPSالعمل هذه الجمل التكرارية تسمى ١-BASIC LOOP ٢-FOR LOOP ٣-WHILE LOOP

: Basic loopأوال أل وبين Loopمن ابسط جمل التكرار حيث انه يتم كتابه الجملة التكرارية بين الكلمة Basic loopيعتبر أل

ى إلى بداية جمله التكرار يرجع مره أخرend loop وفي كل مره عندما يصل إلى الكلمةend loopالكلمة الن loopللخروج من Exit وينفذ الجملة الموجودة بداخل الجملة التكرارية ونضع الكلمة loopوهي الكلمة

يستمر أل Exit وبدون الكلمة Loop من أل معناها انه عندما يجد الشرط المناسب يخرج Exitالكلمة Loop توي والبد أن يحدث مره واحده على األقل في العمل دون توقف ومن الممكن أن يح

:Basic loopالصيغة العامة الستخدام loop الجملة المراد تكرارها

Exit (whenعندما يحدث هذا الشرط ( False أو trueأي يرجع أما Boolean هذا الشرط عبارة عن

:Basic loopمثال الستخدام أل

Page 38: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٣٨ -

والصيغة العامة له كما هي موضحه بالشكل Basic loopفي هذا المثال تم استخدام أل رط أن نريد في هذا المثال تحديد ثمن الدورة ورقم الدورة داخل المتغيران الثمن والرقم من جدول الدورات بش

Loop في كل مره يكرر الجملة الموجودة بعد الكلمة loop ثم بعد ذلك يدخل في ١٠٠٠=يكون سعر الدورة حيث انه يدخل داخل جدول الدورات ويرى أول طالب يأخذ من سجل أول طالب ثمن الدورة ويضيف عليها

يستمر في تنفيذ ٢٠اقل من لو ٢٠ هو اقل من ثم عندما ينتهي من هذه الخطوة يرى رقم الطالب هل١٠ فعندما يكون رقم الطالب ٢٠= جمله التكرار على الطالب الثاني وال ينفذ هذه الجملة عندما يكون رقم الطالب

وال ينفذ الجملة التكرارية loop يخرج من أل ٢٠= اري في نهاية جمله التكرار وتستخدم هذه الكلمة إلنهاء الجملة التكرEnd loop نضع الكلمة

:وإلظهار ناتج هذا التكرار نرى المثال األتي

: loopداخل أل ifاستخدام الدالة :يغة كما سنرى في المثال اآلتيويكون بهذه الص loopداخل أل if من الممكن استخدام الدالة

Page 39: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٣٩ -

هذان المتغيران من النوع الرقمي ثم بدأنا في تنفيذ Id والمتغير Costفي هذا المثال تم تعريف المتغيران

بشرط أن يكون Id وCostب وهو عبارة عن نضع ثمن الدورات ورقم الدورة داخل المتغيران الكود المكتو الذي Idبداخله هذه الجملة التكرارية وهي نزود المتغير Loop ثم بعد ذلك ندخل في ٢=رقم الطالب

ومعناها الخروج Exit ثم ينفذ جمله Id = 40 إذا كان المتغير ١٠يحتوي على بيانات أرقام الدورات بمقدار Loopمن أل

:لنرى النتائج من تطبيق هذا الكود

كما نرى في الشكل السابقCost والمتغيرIdتم طباعه المتغيران :For loopاستخدام

Page 40: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٤٠ -

أيضا لعمل تكرار حيث انه يستخدم لتنفيذ العملية عدد من المرات المعروفة حيث أنها تقوم For يستخدم بتحديد القيمة التي ستبدأ بها والقيمة التي ستنتهي بها

:forالصيغة العامة الستخدام

FOR تلقائيا for المتغير المعرف على داخل أل Inالعدد الذي يبدأ به .. العدد الذي ينتهي به Loop الجملة المراد تكرارهاEnd loop;

forوهذه هي الصيغة العامة لجمله :لتوضيح الصيغة العامة

هذا المتغير (i) متغير وهو مثال وليكن For وتم استخدام بعد كلمه Forام أل هذه هي الصيغة العامة الستخد معناها انه سيتم التكرار عدد من ٥ و ١ والنقطتين الموجودتان بين (5..1)يوضح عدد مرات التكرار من

Loop ثم نكتب بعد ذلك الجملة التكرارية وننهي بعد ذلك أل ١،٢،٣،٤،٥المرات :Forمثال على استخدام

Page 41: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٤١ -

ثم بدأنا في عمل الكود pl/sql ولكن تم تعريفهم خارج كود Cost و IDفي هذا المثال تم تعريف المتغيران وتم استعمال هذان المتغيران على أنهم id و cost داخل المتغيران وهو تم تحديد ثمن الدورة ورقم الدورة

host variable قبل المتغير ثم تم إنشاء جمله تكراريه باستخدام أل (:) فتم وضعFor حيث انه تم تعريف ثم For loopألنه معرف تلقائيا داخل أل Declare هذا المتغير ال يعرف في أل Forمتغير بداخل أل

مرات ٥ وفي هذا المثال يحدث التكرارloop والقيم التي سينتهي بها أل loopالقيم التي سيبدأ بها أل نحدد في كل ٥ بمقدار Id مرات وهذه الجملة التكرارية معناها انه يزود المتغير٥أي سيتم تنفيذ الجملة التكرارية

٤في جدول الدورات للطالب رقم هذا المتغير يحتوي على رقم الدورة الموجود Loopمره يحدث بها ٥ثم يتم التكرار مره ثانيه ونزوده بمقدار ٤٥ عندما يتم تزويده أول مره يصبح ٤٠=فنجد أن رقم الدورة

وفي آخر مره المرة الخامسة ٦٠ وفي المرة الرابعة يصبح ٥٥ ثم في المرة الثالثة يصبح ٥٠ليصبح لمستخدمة للتكرارا For وبهذا نكون قد طبقنا جمله أل ٦٥يصبح

:Idولمشاهده هذه النتائج التي تظهر نقوم بعمل طباعه للمتغير

Page 42: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٤٢ -

وبعلى الكود المكت forكما نشاهد في هذا المثال الناتج بعد تطبيق :ملحوظة

loopوذلك ألنه معرف تلقائيا داخل أل Declareال يعرف في forالمتغير المكتوب في جمله : مثال

من النوع الحرفي وفي هذا v_nameمن النوع الرقمي والمتغير V_id في هذا المثال تم تعريف المتغيراتاحمد ثم تم كتابه = بشرط أن يكون اسم الطالب v_idالمثال تم تحديد رقم الطالب ووضعه داخل المتغير

ألنه يتمDeclareوهذا المتغير ال يتم تعريفه في I ثم بعدها تم كتابه المتغير Forجمله تكرار باستخدام

Page 43: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٤٣ -

الموجودة داخل الجدول ثم ننهي جمله Insert مرات لجمله أل ٣ ويحدث التكرار Forتعريفه تلقائيا داخل أل End loop باستخدام Loopأل

:ولكي نرى الناتج نتبع اآلتي

مرات في ٣ ويتم التكرار For صفوف في الجدول وذلك الن يوجد جمله تكرار في الجدول وهي ٣تم أضافه الجدول

SQL CURSOR

و ظيفتة االحتفاظ بعدد كبير من السجالت cursorيوجد في االوراكل عنصر يسمى : CURSOR أل سجالت و تحديد عددها أثناء التشغيل و تسهيل التعامل مع هذه ال

هو عبارة عن وعاء يتم تخزين كميه بيانات أكثر من سجل واحد و هي تشابه جدول CURSORاى أن أل cursorمؤقت يتم إنشاءه في الذاكرة لالستعمال ثم يتم إلغاءه و في هذه الحالة يتم إنشاء أل

: CURSORو يوجد نوعين من أل · IMPLICIT CURSOR : و هذا النوع يتم إنشائه تلقائيا من قبل االوراكل لإلجراء العمليات

.التي تحتاج ذلك أو إجراء عمليات على مجموعة من السجالت DMLعبارات حيث انه ينشط و يؤكد مخرجات

Page 44: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٤٤ -

!خطأ

· EXPLICIT CURSOR : هذا النوع الخاص بالمبرمج و الذي يقوم بإنشائه لتنفيذ األوامر و

العمليات على مجموعة من السجالت من اختياره و يجب عليك اآلن أن تعرف كيف تتحكم في الجملة

Cursorللتحكم في أل Open , Fetch and Closeانك تستخدم

١. Declare : لإلعالن عن المتغيرات و االستعالمات و عمل اسم ألCursor . ٢. Open Cursor :ل االستعالم تسمى لتنفيذ االستعالمات و المتغيرات و الصفوف المعرفة من خال

Active set و تكون مسموحة لعمليه ألFetch . ٣. Fetch Data From Cursor : تحميل الصفوف داخل المتغيرات ٤. Empty : الفحص الصفوف و الرجوع إلى عمليه ألFetch إذا وجد صفوف ٥. Close : إلغالق ألcursor

Cursor اإلعالن عن أل Cursorفي اإلعالن عن أل INTOارةال تستخدم عب ·داخل Order Byيجب عليك استخدام عبارة sequenceلو كنت تستخدم في الصفوف عبارة أل ·

االستعالم : الصيغة العامة

CURSOR cursor_statment IS Select_statment ;

Declare Cursor مثال في اإلعالن عن أل

Page 45: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٤٥ -

!خطأ

٢- Open Cursor :

لتنفيذ االستعالم و ليطابق أو يساوى المتغيرات الصفوف CURSORلفتح أل ٣- FETCHING DATA FROM THE CURSOR :

إرجاع الصف الحالي في المتغير و البد أن تحتوى على نفس أرقام المتغيرات و الفحص لكنى نرى اذا كان يحتوى على صفوف cursorأل

cursor غلق أل -٤

Page 46: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٤٦ -

: cursorو يستخدم أل ***

.مفتوحة أم ال للتعامل معها CURSORل هل للسؤاISOPEN% األمر -- CURSORالسترجاع أرقام الصفوف بدقة في أل ROWCOUNT% األمر -- أم ال CURSORلمعرفة هل يوجد سجالت في أل FOUND% األمر -- و لكن بصيغة نفى FOUND % نفس استعمال األمر NOTFOUND% األمر -- CURSORسجالت من لألخذ ال FETCH% األمر --

%ISOPEN يحضر الصفوف فقط عندما يكون الCURSOR مفتوح

• %NOTFOUND , %ROWCOUNT n %ROWCOUNT :قة السترجاع أرقام الصفوف بد n %NOTFOUND : نستخدمه لتحديد متى سنخرج من ألLOOP .

Page 47: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٤٧ -

. موظفين واحد تلو اآلخر ١٠مثال السترجاع

Recordو أل Cursorأل

recordممكن أن نحضر قيمها داخل أل cursorالمستعلم عنها في أل و الصفوف :مثال

Cursor For Loopsأل • Cursor For Loops هو اختصار لعمليات ألExplicit Cursor الن ألCursor يكون

قد أغلق loopو أل loopمفتوح و الصفوف قد استرجعت أو أحضرت و تكررت في أل .اتوماتيكيا عندما تكون جميع العمليات على الصفوف قد انتهت

نفسه انتهى اتوماتيكيا في نهاية التكرار عندما يكون أخر صف قد احضر loopأل •

: Cursor For Loopألمر الصيغة العامة ل

Page 48: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٤٨ -

For record_name In cursor_name Loop Statement 1 ; Statement 2 ;

…………… End loop ;

:بعض المالحظات n ال تقم بتعريف ألRecord الذي يتحكم في ألLoop هدفه فقط داخل ألLoop . n قم باختيار ألCursor من خالل ألLoop . n قم بزيادة ألCursor ب ألParameters يتلوها اسم أل ( ) إذا تتطلب و ذلك داخل

Cursor و ذلك داخل عبارةFor . n ال تستخدم ألCursor For Loop عندما تكون عمليات ألCursor تصحح يدويا .

. For Loops Cursorاستخدام االستعالمات المتعددة في أل . يسمح لك باستخدام االستعالمات المتعددة pl/sqlالن أل cursorلست محتاج أن تعرف أل

Cursorفي أل Parametersاستخدام أل

Page 49: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٤٩ -

عندما يكون مفتوح و معنى ذلك انك ممكن أن تفتح Cursorتسمح للقيم بالمرور إلى أل Parametersأل و استرجاع استعالمات مختلفة Blockكذا مرة داخل أل Explicit Cursorأل

: الصيغة العامة CURSOR Cursor_name [ ( parameter_name datatype ,…. )] IS Select_Statment ;

PL/SQLمعرف سابقا في أل cursorاسم أل : Cursor_nameأل Parameterاسم أل : Parameter_nameأل Parameterنوع بيانات أل : datatypeأل Intoعبارة استعالم بدون كلمة : Select_statmentأل

Parameterتقوم بمرور القيم إلى اى cursorعندما يفتح أل

: For Update Clauseاستخدام تريد أن تقوم بغلق أل الصفوف قبل قيامك بعمل تعديل أو حذف للصفوف الموجودة تقوم بإضافة عبارة

For Update Clause في استعالم ألCursor إلغالق الصفوف عند فتح ألCursor : الصيغة العامة

Select ……. From …… For Update [ of column_reference ] [Nowait] ;

عمود في جدول مقابل لالستعالم المصنوع : Column_referenceأل يرجع أخطاء االوراكل لو كانت الصفوف مغلقه في مكان أخر : Nowaitأل

For Update : يعتبر أخر عبارة في عبارة االستعالم بعد عبارةOrder By لو كانت موجودة

Page 50: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٥٠ -

Where Current of Cursorاستخدام لعمليه التعديل أو الحذف الصف الحالي Cursorتستخدم أل

لغلق الصفوف Cursorفي استعالم أل For updateاحتوائها على عبارة Explicit Cursorلإلشارة إلى الصف الحالي من خالل أل Where Current ofاستخدام

. في االستعالمات المتعددة cursorاستخدام أل داخل استعالم أخر و تظهر من () تعالم عادة تكون مغلقة داخل هي عبارة عن اس: االستعالمات المتعددة

من جمله االستعالم و تستخدم whereو يستخدم أيضا في عبارة أل sqlخالل عبارات معالجة بيانات أل Fromأيضا في عبارة أل

: مثال

PL/SQLمعالجه األخطاء في

: تقسم أخطاء البرنامج إلى ثالث أنواع و هي

Syntax Errorالخطاء الهجائي -١

Page 51: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٥١ -

و هو خطاء في حروف كلمات اللغة و ذلك بكتابه أمر خطاء أو خطاء في قاعدة نحويه ألوامر اللغة مثل اع األخطاء حيث يتم تصميم أوال بأول و هذا هو أسهل أنو End If أو بدون Then بدون Ifكتابه أمر

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

LOGIC ERROR الخطاء المنطقي -٢

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

. خطاء IFمعادله خطاء أو استخدام جمله شرط

RUN TIME ERRORالخطاء أثناء التشغيل -٢

عه المبرمج و لم يتعامل و هو ظهور رسالة خطاء للمستخدم أثناء تشغيل البرنامج و ذلك لوقوع خطاء لم يتوقمعه مثل أمر طباعة في حين أن اله الطباعة غير جاهزة فيقوم نظام التشغيل بقطع عمل البرنامج و إعطاء

رسالة خطاء

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

اى االستثناءات حيث يتم توجيه البرنامج إلى هذا االستثناء عند EXCEPTIONالخطاء و ذلك باستعمال .حدوث خطاء

EXCEPTIONمعنى كلمه

م هو بتناول الخطاء و القيام بعمل و هي جزء من األمر يتم توجيه سير البرنامج إليه عند حدوث خطاء ليقو الالزم عند حدوث الخطاء و كذلك الرسائل المطلوب إظهارها عند حدوث الخطاء

و هي EXCEPTIONSو يوجد ثالث أنواع من االستثناءات

Predefined Exceptionاستثناء معرف § User Defined Exceptionاستثناء من تعريف المبرمج §

Internal Exceptionاستثناء داخلي §

predefine exceptionاالستثناء المعرف من قبل -١

أو predefined لمجموعة من الحاالت و التعامل معها و تسمى oracleو هو استثناء معرف من قبل built-in فمثال هناك خطاء معرف يسمى no data عند قيام جمله select ر بإعادة بيانات وال تعيد يظهno data أو خطاء آخر و هو قيام جمله select بإعادة أكثر من سجل في حين انك تستعمل select into

و لكن oracleحيث تخزن هذه البيانات في متغير سجل واحد و هذه األخطاء يتم التعامل معها من قبل في exceptionوامر في جزء أل لتغيير الرسالة و التعامل مع هذا الخطاء من قبل المبرمج تقوم بكتابه األ

يعرف حاله حدوثه لذلك ما عليك سوى كتابه األوامر oracleنهاية بلوك األوامر وهذا النوع يتميز بان أل التي تنفذ عند حدوث هذا الخطاء

Page 52: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٥٢ -

user_defined exception خطاء معرف من قبل المبرمج -٢

و له ثالثة user defined تعريفه من قبل المبرمج لذلك يسمى و لكن يتم oracleهذا النوع ال يعرفه أل : أجزاء هي

. exception declaration جزء التعريف ·

فيتم تعريف متغير جديد Oracleوهو جزء اإلعالن عن اسم هذا النوع من الخطاء ألنه غير معرف لدى exceptionمن النوع

exception teasingاختبار الخطاء ·

ال يعرف معناه و ال يعرف وقت حدوثه ليوجه oracleو فيه يتم وضع شرط حدوث هذا الخطاء الن أل exceptionسير البرنامج إلى قسم أل

exception handlingالتعامل مع الخطاء ·

د تعريف و تحديد حاله حدوثه للقيام التقليدي الذي ينتظر أن يوجه إليه الخطاء بع exceptionو هو قسم أل بالزم و تنفيذ األوامر و الرسائل التي يكتبها المبرمج

و من القيم المعرفة ..,exception1,2للعبارة و يوجد عدة أنواع من األخطاء المحددة بكلمات معرفة بديله لدى االوراكل ما يلي

*NO_DATA_FOUND : تستعمل عند تنفيذ أمرSELECT أو CURSOR و لكن لن تعيد بيانات

*TOO_MANY_ROWS : وهى عكس العبارة السابقة حيث تستعمل عندما تكون عدد القيم المسترجعة ث ال يصلح وضعه في متغير واحد كبير بحي SELECTمن األمر

*INVALID_CURSOR : و تنتج عندما يتم التعامل مع متغير على انهCURSOR و لكنه ليس كذلك

*ZERO_DIVIDE : و يعنى حدوث عمليه قسمه على ألZERO

*DUP_VAL_ON_INDEX : ل معناها محاوله االضافه في جدول مع محاوله تكرار القيمة في الحقPRIMARY KEY .

Page 53: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٥٣ -

الدوال التي تتعامل مع األخطاء

يوجد في االوراكل بعض الدوال التي تتعامل مع األخطاء منها

رقم الخطاء الناتج و تعيد رقم يعبر عن SQLCODE الدالة

تعيد الرسالة المحفوظة لهذا الخطاء SQLERRMو الدالة

: الستعمال هذه الدوال و المتغيرات مثال

Page 54: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٥٤ -

USER DEFINED ERRORS التعامل مع األخطاء المعرفة من المبرمج --

ORACLE هي أخطاء ال يعرفها ال USER DEFINED ERRORSاألخطاء المعرفة من قبل المبرمج

رة و لكنها من وجهة منطق البرنامج أخطاء فمثال عندما تزيد نسبة نجاح الطالب و ربما ال تكون أخطاء مباشيعتبر البرنامج ذلك خطاء في حين ال يعرف االوركل ذلك و بالتالي يقوم المبرمج بتعريف معنى % ١٠٠عن

و حاله حدوث هذا الخطاء و كيفيه التعامل معه

: و يأخذ ذلك التركيب التالي

من قبل المبرمج ثم التعامل معه في قسم أل EXCEPTIONو المثال التالي يوضح كيفيه تعريف خطأ EXCEPTION

و USER DEFINED ERRORو مثال أخر نوضح فيه كيفيه تعريف خطاء من قبل المستخدم من النوع كيفيه التعامل معه

Page 55: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٥٥ -

OTHERSاستعمال

للتعامل مع األخطاء التي يتم EXCEPTION في قسم األخطاء WHEN OTHERSتستعمل الجملة اى عند حدوث أخطاء أخرى WHEN OTHERES و كأنها تقول WHENالتعامل معها باستعمال جمل

WHEN OTHERSنفذ ما يلي و يوضح هذا المثال استعمال

Page 56: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٥٦ -

: Building Procedure & Functionإعداد الدوال و البرامج الفرعیة

Building Procedure & functionو في ھذه الفقرة سوف نتناول إعداد الدوال و البرامج الفرعیة

:و ذلك من خالل

Pl/sql Permission and Pl/sqlالصالحیات الالزمة لبرامج أل - procedureإنشاء أل - parameter passingإرسال معامالت للبرامج الفرعیة - Functionإنشاء الدوال -

Permission الالزمة لإلنشاء برامج الصالحیات -١

DBAلكي تتمكن من كتابھ دوال أو البرامج الفرعیة في االوراكل البد من أن یمنحھ مدیر قاعدة البیانات

آو من لھ حق في ذلك الصالحیة إنشاء دوال فرعیھ و یتم ذلك كما في المثال التالي

pl/sqlو بھذا تم إنشاء الصالحیات الالزمة إلنشاء برامج أل

n إنشاءProcedure

ال نشاء البرامج الفرعیة Create Procedure یتم استعمال األمر procedureبعد منح صالحیة إنشاء أل

العامة لألمر ھي و الصیغة

CREATE [OR REPLACE ] PROCEDURE procedure_name [(parameter1[mode1] datatype1,parameter2[mode2] datatype2,……….)] IS | AS PL/SQL BLOCK;

CREATE OR REPLACE PROCEDURE أمر إنشاء أو تعدیل البرنامج الفرعي

Procedure_name راد انشائة اسم البرنامج الفرعي الم

Page 57: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٥٧ -

Parameter أسماء المتغیرات التي تمرر قیمھا

Mode نوع أل parameter و یوجد ثالث حاالت ل أل parameter

( IN , OUT ,IN OUT)و ھم

datatype نوع البیانات التي تأخذھا أل parameter

Pl/sql block رنامج الفرعي و ھو جسم البرنامج الفرعي الذي یقوم بأحداث الب

و ھذا المثال یقوم بإنشاء برنامج فرعى للموظفین و یقوم البرنامج بعمل تعدیل على جدول الموظفین بتعدیل مرتب موظف الذي ترید زیادة مرتبھ

raise_salary النشاء برنامج فرعى باالسم create procedureففى السطر االول تم استعمال االمر

وكذلك تحید طبیعتھ اذا v_id و ھو raise_salaryو فى السطر الثانى نحدد متغیر واحد فقط للبرنامج الفرعى او اخراج القیم فیھ اى یصلح الستقبال القیم عند استدعاء الدالھ out او inكان

اما فى السطر الثالث یبدا البرنامج الفرعى و یبدا بالعالن عن عن المتغیرات

و ھى بدایھ االوامر التى تنفذ begin الكلمھ ٤اما فى السطر رقم

ة الذى یقوم بتعدیل مرتب الموظف او الذى استدعاءا update وھى المر تعدیل sql جملھ ٦٫٧٫٨اما فى السطور

تم انھاء البرنامج الفرعى و كتابھ اسم البرنامج ٨و فى السطر رقم

procedureتعدیل ال

حیث یقوم االمر بعمل تعدیل اذا create or replace procedureو یتم تعدیل البرنامج الفرعى بإستعمال االمر لمثال السابق كان البرنامج الفرعى موجود او ینشىء برنامج جدید و بالتالى فى ا

Page 58: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٥٨ -

بھذا السطر١ یتم استبدال السطر رقم

create or replace procedure raise_salary للقیام بتعدیل اى كود بداخل البرنامج الفرعى

و اآلن نرى النتیجة التي سیقدمھا البرنامج الفرعي

PARAMETERS باستعمال PROCEDUREإنشاء أل

Page 59: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٥٩ -

أو البرنامج الفرعي functionاخل أقواس الدالة من الضروري جدا اإلعالن عن المتغیرات كمعامالت دprocedure و ذلك الن المعامالت توسع استعمالھا و المعامالت تأخذ ثالثة أنواع :

و ھو الذي یستقبل قیمة عند استدعاء الدالة و ال یمكن إعادة قیمة فیھ لمكان االستدعاء : INالنوع - الذي یأخذ قیمة تعود لمستدعى الدالة فقط و ال یستعمل الستقبال قیم عند و ھو : OUTالنوع -

.االستدعاء و ھو النوع الذي یسمح باستقبال القیم عند االستدعاء فیھ و كذلك إعادة قیم للخروج : IN OUTالنوع -

فیھ

ما یلي الذي تم إنشاءه ك rasie_salaryو یالحظ عند استدعاء البرنامج الفرعي

Execute raise_salary (7788) ;

كمعامل لھ بالتالي یتم ٧٧٨٨ مع إرسال القیمة raise_salaryفي ھذا السطر تم استدعاء البرنامج الفرعي ثم استعمالھ داخل السطور لتعدیل مرتب in المعرف كمعامل من النوع v_idاستقبال القیمة في المتغیر

لتالي یمكن استدعاء البرنامج الفرعي أكثر من مرة مع تغییر كود الموظف و با٧٧٨٨الموظف الذي كوده المطلوب حذفھ

INكیفیھ استعمال المعامل من النوع

INكیفیة التعامل مع المعامل و المثال السابق یوضح

Page 60: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٦٠ -

:نالحظ ھذا المثال

وذلك ألنھ یتم إرجاع قیم إلى Outفي ھذا المثال ظھر ھذا الخطأ ومعناه انھ البد من استخدام معامالت من النوع فانھ یظھر ھذا الخطأ وذلك ألنھ المعامالت التي من النوع Inالكود ولكن في حالھ استخدام معامالت من النوع

INجع قیم تستقبل قیم فقط وال تر

Outلذلك سنقوم باستخدام المعامالت من النوع

OUTاستخدام المعامل من النوع

و ھذا النوع یأخذ قیمھ تعود لمستدعى الدالة فقط ال یمكن أن یستخدم الستقبال قیم عند االستدعاء

و ھذا المثال یوضح ذلك

Page 61: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٦١ -

نقوم بعمل التالى OUTو لكى نشاھد قیم المعامل من نوع

VARIABLE و ذلك بإستخدام االمر HOST VARIBALESنقوم بإنشاء -١ hostvariableئھا بإعطائھ المتغیرات التي قمنا بإنشا query_emp procedureنقوم بإحضار أل -٢

OUTكا معامالت من النوع PRINTلكي نقوم بمشاھدة النتیجة نستخدم آمر -٣

و كما سنرى اآلن من خالل المثال السابق الذي قمنا بعمل

:Out parameterمثال اخر على استخدام

Page 62: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٦٢ -

ع أي یرجOut من النوع ID وتم إعطاءه معامالت وھي agc12 یسمى Procedureفي ھذا المثال تم تكوین أي یرجع قیمھ في الكودOut وھو من النوع Nameقیم إلى الكود والمعامل اآلخر ھو االسم

ثم نھایھ ال NameوIDثم تم وضع القیم الموجودة داخل االعمده رقم الطالب واسم الطالب داخل المعامالن Procedure

: ولنرى الناتج من ھذا االجراء كما في المثال االتي

وھو ID نعرف أوال المعامل Nameوالمعا مل ID وھي Procedureلطباعھ المعامالت الموجودة داخل أل ثم Execute باستخدام Procedureعاء أل ثم نقوم باستد من النوع الحرفيNameمن النوع الرقمي والمعامل

ونضیف إلیھ المعامالت ثم نقوم بعمل طباعھ للمعامالت كما موضح في الشكل السابقProcedureاسم أل Out وبھذا نكون قد تعرفنا على المعامالت التي من النوع

IN OUTكیفیھ استخدام المعامل من النوع

IN OUT عمل معامل من النوع و سوف نرى اآلن مثال عن كیفیھ

Page 63: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٦٣ -

حیث یقم باستقبال قیم و إرجاعھا مرة أخرى بشكل بھذا IN OUTو في ھذا المثال تم عمل معامل من النوع 0575-633(800)وضح في المثال الشكل كما ھو م

و اآلن سوف نرى كیفیھ مشاھدة ھذا البرنامج الفرعي

: و ذلك بعمل

VARIABLE و ذلك باستخدام األمر HOST VARIBALE إنشاء -

بالقیم HOST VARIABLEنقوم بتزوید أل - HOST و بإضافة إلیھ أل FORMAT PHONEإحضار البرنامج الفرعي و ھو -

VARIABLE كأنھا IN OUT PARAMETER PRINTللمشاھدة نستخدم أمر -

و كما سنرى اآلن في ھذا الشكل

:IN OUT Paramterمثال آخر الستعمال

Page 64: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٦٤ -

IN OUT ھذا المعامل نوعھID ویأخذ معامل واحد وھو Agc13 یسمى Procedureفي ھذا المثال تم تكوین أي یقوم باستقبال قیم وإرسال قیم إلى الكود عند استدعاءه

:ولمشاھده النتائج نتبع اآلتي

Page 65: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٦٥ -

أي انھ یستقبل قیم ویخرج قیم إلى الكودIn outنالحظ في ھذا المثال أننا نرید أن نطبع المعامل الذي من النوع

IN وذلك الن المعامل ٥في أول جزء تم تعریف المعامل من النوع الرقمي ثم تم إعطاء المعامل القیمة رقم Paramter فقط وفي المرة الثانیة تم عمل وبالتالي یستقبل القیم التي تعطى لھExecute ثم اسم أل Procedure

أي انھ یخرج قیم للكود ونالحظ اختالف الناتج في Outثم نكتب اسم المعامل وذلك ألنھ یعتبر معامل من النوع حظ الناتج كلتا الحالتین ففي الحالة األولى یكون الناتج مساو للقیمة التي نعطیھا للمعامل وفي الحالة الثانیة نال

حسب رقم الطالب الموجود في الجدول

داخل DEFULTE OPTION FOR PARAMETER قیم أساسھ PARAMETERإعطاء أل البرنامج الفرعي اى عند عدم إعطاء المعامل قیم تكون ھي القیم االساسیھ لھ

و

: نرى ذلك من خالل المثال التالي

Page 66: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٦٦ -

و اآلن نرید أن نجرب البرنامج الفرعي الذي قمنا بإنشائھ فنقوكم بتشغیلھ و إضافة بیانات إلى جدول األقسام كما سنرى في المثال االتى

Page 67: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٦٧ -

pl/sqlیمكننا إحضار البرامج الفرعیة من اى أداة أو اى لغة تدعم أل

إحضار البرامج الفرعیة من خالل البوكات الغیر مسماه

raise_costو سوف نقوم بإحضار برنامج فرعى باسم

v_idحیث یأخذ معامل

كما سنرى اآلن في ھذا المثال و

األخطاء التي تؤثر على البرامج الفرعیة

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

و عندما تكون یظھر الخطاء في البرنامج الفرعي تقوم وحدة التحكم في البرنامج بالذھاب إلى جزء االستثناءات بلوك فتقوم وحدة التحكم بالذھاب إلى الذي یقوم بتصحیح الخطاء و إذا تم تصحیح ھذا الخطاء الموجود في ال

البرنامج الفرعي

تكون جزء من الحدث EXCEPTION تنفذ بعد أل DMLو اى عبارات

و إذا لم یقم جزء االستثناءات بتصحیح ھذه األخطاء فیقوم الخطاء بانتشار و الذھاب إلى التطبیق الذي نستخدم فیھ ھذا البرنامج الفرعي

من قاعدة البیانات ذف البرنامج الفرعيحو اآلن یمكننا

DROP PROCEDUREو ذلك باستخدام أمر

: الصیغة العامة لألمر ھي

DROP PROCEDURE procedure_name ;

: مثال

Page 68: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٦٨ -

Creating PL/SQL Functionإنشاء داله **

PROCEDURE هي برنامج فرعى مثلPL/SQLفي جميع اللغات بما فيها أل : Function الدالة الموجودة باللغة SQRT(X) و لكن يختلف عنه في أن الدالة ال يمكن أن تعيد أكثر من قيمه فمثال الدالة

داله أخرى و هكذا اى Xجزر التربيعى للقيمة تعيد قيمه واحدة فقط و هي ال

كما SQL PLUS في بيئة البرنامج CREATE FUNCTION و يتم إنشاء الدالة باستعمال األمر هو موضح

الصيغة العامة لألمر هي

CREATE [ OR REPLACE ] FUNCTION function_name [ (parameter 1 [mode1] datatype1 , Parameter 2 [mode2] datatype 2 , ………………….. ) ] RETURN datatype IS | AS PL/SQL Block ;

اسم الدالة : function_name أل

الذي يقوم بتمرير القيم داخل الدالة PL/SQLمتغير في أل : parameter أل

parameterو هو نوع أل : mode أل

parameterو هو نوع بيانات أل : datatype أل

functionنوع البيانات المخرجات الموجودة في أل : return datatype أل

: مثال

Page 69: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٦٩ -

Or replaceومعناھا كون ثم تم استخدام Create باستخدام األمر agc20المثال تم تكوین دالھ تسمى في ھذا ویتم إعطاء agc20 وھي Function ثم اسم أل Functionألنھ من الممكن أن یحدث تعدیل في الدالة ثم نكتب

من النوع الحرفي وھو name من النوع الرقمي والمعامل الثاني وھو االسم idمعامالت لھا وھي

أن نستخدم معامالت منFunction أي انھ یستقبل قیم وال یصح داخل أل INونالحظ أن المعامالت من النوع وبعدھا IS أي یستقبل القیمة من الدالة ثم نكتب IN وذلك الن الدالة تقوم باحتساب قیم لذلك نستخدم Outالنوع

داخل جدول الطالب ومن شروط الدالة أنھا البد أن ترجع Insertنقوم بكتابھ الكود وھو ھنا عبارة عن جملھ ثم اسم المتغیر التي ترجع return حیث أننا نقوم بكتابھ idقیمھ ھذه القیمة توجد داخل متغیر ھذا المتغیر ھنا ھو

Agc20 ثم اسم الدالة Endفیھ القیمة ثم ننھي الدالة بكتابھ

مثال آخر

Page 70: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٧٠ -

وھو من نفس نوع بیانات P_id ھذه الدالة تأخذ معامل ھو Get_salفي المثال السابق تم تكوین دالھ تسمى تقوم باسترجاع نوع البیانات الرقمیة أرقام الموظفین الموجود داخل جدول الموظفین وھذه الدالة empnoالعمود

من النوع الرقمي أو نفس نوع بیانات عمود المرتب الموجود في v_salaryفقط ثم تم تعریف متغیر یسمى وھو ھنا عبارة عن تحدید مرتب الموظفین داخل المتغیر الذي تم تعریفھ pl/sqlجدول الموظفین ثم تم كتابھ كود ثم v_salaryھا البد أن ترجع بیانات ھذه البیانات سیتم وضعھا داخل المتغیر سابقا ومن خصائص الدالة أن

Get_sal ثم اسم الدالة وھي Endننھي الدالة باستخدام

من النوع الرقمي ثم نستدعي الدالة باستخدام األمر g_salaryولمشاھده النتائج نعرف أوال اسم المتغیر وھو

Executeھ اسم الدالة وقیمھ المعامل الذي بداخل الدالة الن المعامل من النوع ثم اسم المتغیر ونعطي لIN أي Get_sal(7788) البد من إعطاءه قیمھ كما ھو موضح بالشكل

: مالحظه

قد يستقبل معامل أو أكثر أو قد ال يستقبل و كذلك يعيد نتيجة أو أكثر أو ال يعيد procedure في أل نهائيا

قد تستقبل معامل أو أكثر آو قد ال تستقبل و لكن ال تستطيع إال أن تعيد قيمه واحدة و ال functionالدالة الن الدالة ال تعيد إال قيمه واحدة و تعيدها باستعمال األمر in out أو outيصلح أن تحدد نوع المعامل

return تكون نوع المتغيرات و المعامالت من األنواع االساسيه في االوراكل و الدالة البد أن تعمل و البد أن group و ليس single rowعلى قيمه واحدة sql في تعبيرات أل functionاستخدام الدوال

Page 71: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٧١ -

من المرتب و نقوم % ٨وھذه الدالة تقوم بعمل ضریبة على المرتب بمقدار taxنقوم بعمل دالھ اسمھا

في جملة استعالم حیث نطلب منھ إحضار اسم و رقم و مرتب و الضریبة التي sql باستخدامھا في أل ١٠م الذي سیطبق علیھ ھذه الدالة ھو القسم رقم ستوضع على المرتب من جدول الموظفین على أن القس

في اى وقت عندما یكون لھا استخدام sqlو الدوال التي تنشاھا ممكن أن تنادى علیھا في بیئة أل

ال آخرمث

Page 72: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٧٢ -

وھو من النوع الرقمي ویستقبل قیم فقط ID تأخذ المعامل agc21 في ھذا المثال تم تكوین دالھ حدیده تسمى ھذا المتغیر تم وضع أرقام تلیفون v_noلرقمي ثم تم تعریف متغیر جدید وھذه الدالة ترجع بیانات من النوع ا

قیمھ المعامل وبذلك تم تكوین الدالة= الطالب داخل ھذا المتغیر بشرط أن یكون رقم الطالب

إذا أردنا المناداة على الدالة كما في المثال السابق

ونعطي اسم الدالة Executeدالة باستخدام األمر من النوع الرقمي ثم ننادي على الg_noأوال نعرف متغیر ونالحظ ذلك في الناتجg_no ثم نقوم بطباعھ ھذا المتغیر وھو agc21(1)وقیمھ المعامل بداخلھا مثل

sqlالقواعد و القيود الالزمة عند مناداة الدالة من أل

ب أن تكون مخزنة أو محفوظة الدالة يج · . فقط IN PARAMETERالدالة تأخذ · الموجودة PARAMETER في أل PL/SQL ليس SQLتأخذ أنواع بيانات أل ·

Table أو أل Boolean مثل أل FUNCTION في أل PL/SQL و ليس في SQL إرجاع أنواع بيانات صالحه في · DML ال يجب أن تحتوى على جمل · في نفس الوقت على جدول واحد مثال إذا DELETE و UDATEال يصلح عمل ·

في األول و أنت في آخر الجملة مثال حولت تعمل UPDATE و حاولت تعمل FUNCTIONكان عندك DELETE ال يصلح سوف يقوم بالرفض

Page 73: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٧٣ -

REMOVING FUNCTIONلعمل حذف للدالة

:الصيغة العامة

REMOVE FUNCTION function_name ;

اسم الدالة function_nameحيث

Page 74: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٧٤ -

واآلن البد أن نعرف بعض الصالحيات التي يتم إعطاؤها للمستخدم من قبل مدير قاعدة البيانات

البد أن (Table,View,Subprogramme) وهي عبارة عن Objectلكي يسمح للمستخدم أن يشير إلى Objectيقوم مدير قواعد البيانات بإعطاء صالحيات السماح للمستخدم بتموين وتعديل في هذه أل

صالحية يقوم مدير قاعدة البيانات باعطاءها للمستخدم ولكن من هذه الصالحيات عمل ٨٠ويوجد أكثر من Create أو Alter أو drop أو أي صالحيات أخرى مثل Grant alter any table to ahmed ويتم إعطاء

Sys أو Systemهذه الصالحيات من خالل

موجودة داخل قاعدة البيانات مثل Objectم أل وعند إعطاء الصالحية البد أن نعطي اس

Page 75: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٧٥ -

Grant alter on emp to ahmed

مثلSub programmeوبالنسبة للدوال واإلجراءات البد أن نعطي للمستخدم صالحية تكوين هذه أل

Create procedure وعند استخدام كلمه Any داخل الصالحية فإنها تسمح للمستخدم أن يقوم بعمل Create الموجودة على قاعدة البيانات أو أي قاعدة بيانات أخرىObject ألي من أل Drop أو Alterأو

فقطCreate procedureليست ضرورية وتستخدم في حاله Anyونالحظ أن كلمه

والبد عند استدعاء اإلجراء أو الدالة أن يكون للمستخدم صالحية المناداة على اإلجراء أو الدالة أي عمل Execute ويتم إعطاء هذه الصالحية في حاله أن المستخدم ليس هو مالك هذا ألObject

:واآلن سنرى بمثال كيفيه إعطاء هذه الصالحيات

System/manager أوال ندخل باسم المستخدم وكلمه المرور

NameوID هذا الجدول يحتوي على عمودين هما Fadyثانيا ننشئ جدول داخل المستخدم يسمى الجدول

:كما هو مبين في الشكل االتي

Page 76: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٧٦ -

nameوid وبه االعمده fadyتم تكوين الجدول يسمى جدول

تخدم تم تكوینھ سابقا في ھذا المثال تم إعطاء صالحیة اإلتیان بالبیانات من جدول لمستخدم یسمى احمد وھذا المس System/managerداخل

وبھذا یستطیع المستخدم احمد أن ینظر إلى الجدول فاضي ویأتي منھ بالبیانات بطریقھ مباشره

أن یرى ھذا الجدول اویحدد بیانات منھ؟Shereenولكن ھل یستطیع مستخدم آخر ولیكن

Procedureلك عن طریق أن یقوم المستخدم بتكوین بالطبع ممكن أن یقوم مستخدم آخر بان یرى الجدول وذ لھ القدرة على قراءه البیانات من الجدول كما سنرى اآلنProcedureجدید ھذا أل

Ahmed/ihab باستخدام Connectعند عمل : أوال

Page 77: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٧٧ -

:Procedureثانیا یتم تكوین

Out Parameter من النوع v_id وإعطاءه معاملHany2یسمى Procedureتم تكوین

Fady من جدول Select هذا المستخدم سيعطى له صالحية عمل Shereenسمى ثم نكون مستخدم جديد ي الذي قام المستخدم احمد Procedureولكن بطريقه غير مباشره وذلك عن طريق انه يقوم بالمناداة على أل

:بعمله وسنرى ذلك في هذا المثال

Page 78: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٧٨ -

بالرغم من أنھا لیس لھا Fady1لھا القدرة أن ترى البیانات داخل الجدول Shereenوبھذا فان المستخدمة Hany3 الذي تم تكوینھ وھو Procedure من ھذا الجدول ولكنھا تستطیع من خالل أل Selectصالحیة عمل

الجدول وھذه تسمى بالطریقة غیر المباشرةأن ترى البیانات في

وبھذا نكون قد تعرفنا على الطریقة المباشرة والطریقة الغیر مباشره للدخول على البیانات في الجدول

Execute البد أن يكون المستخدم له الصالحية على عمل Procedureوللتأكد من أن المناداة على أل

:نرى المثال اآلتي

من النوع الرقمي ثم v_id لها معامل واحد وهو agc15في هذا المثال تم تكوين داله جديدة هذه الدالة هي في الجدول Selectنفيذ هذا اإلجراء يقوم بعمل ومعناها لو أن المستخدم له صالحية عمل تAuthidتم كتابه

Page 79: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٧٩ -

وهي عبارة عن أسماء الجداول أو المكتبات أو أل إجراءات أو الدوالObjectلتحديد أسماء أل

:مثال

وهذا ما يوضحه الناتج USER_OBJECT الموجودة داخل جدولObjectفي هذا المثال تم تحديد أسماء أل

Page 80: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٨٠ -

procedure , function , package , package body للوصول إلى نص user_sourceو يستخدم أل كل منها تحتوى على عمود dba_source و all_sourceمخزنة و يقوم أيضا بفحص مشاهدات أل

و لو كان ملف المصدر غير متاح يمكنك استخدام بيئة أل objectو لمالك أل و ه ownerايضافى وهو sql*plus إلعادة إنشائها من خالل أل user_source

:مثال

Page 81: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٨١ -

Page 82: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٨٢ -

للحصول على نص مصنف الخطاء

أو تستخدم لمشاهدة األخطاء في أوامر أل USER_ERROR data Dictionary viewوتستخدم SQL*PLUS

كل منها تحتوى على عمود ايضافى ALL_ERRORS AND DBA_ERRORSو يستخدم أيضا لفحص OWNER لمالكي أل OBJECT .

Page 83: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٨٣ -

للقيام USER_ERRORS data dictionary view من خالل SQLو في هذا المثال نستخدم عبارة أل بعمليه مشاهدة األخطاء الموجودة في البرنامج

: Packageحزم الدوال و البرامج الفرعية

Page 84: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٨٤ -

في لغة االوراكل و تحت اسم يعبر عن الغرض من PL/SQLو هي احد الطرق المتاحة لتجميع أوامر أل هذه األوامر

و دائما يسعى التطوير في طرق البرمجة إلى النظام و اختصار أوامر البرامج لتسهيل إعادة استخدامها

التي تناولناها فبدال من كتابه function و الدوال procedure البرامج الفرعية و كانت أول هذه الطرق كل مرة في أكثر من موضوع و عند االحتياج إليها يعاد كتابتها ظهرت فكرة الدوال و PL/SQLأوامر أل

تؤدى غرض procedure أو functionالبرامج الفرعية التي تقوم بتجميع مجموعة األوامر و إنشاء داله و ليس هناك الحاجة إلعادة كتابه سطورها functionمعين و عند االحتياج لهذا الغرض يتم استدعاء الدالة

.مرة أخرى و هذه هي أول خطوة حيث يتم اإلنشاء مرة واحدة و االستدعاء أكثر من مرة

و البرامج Functionوال لتزيد األمر تنظيما فبدال من إنشاء كثير من الد Packageو جاءت فكرة أل لغرض معين و ليكن ) الحزمة ( Package المتناثرة و غير المنتظمة يتم إنشاء أل Procedureالفرعية بإرسال الرسائل Procedure , Functionمجموعة من دوال ) إنشاء( مثال ثم تجميع messageالرسائل

message داخل هذه الحزمة Package يصبح لديك مكتبه من الحزم و بهذا األسلوبPackages و ليس : الدوال فمثال

message packageحزمة الرسائل

validation packageحزمة مراجعة البيانات

menu packageحزمة التعامل مع قوائم االختيارات

و بهذا أصبح األمر أكثر نظاما

. Packageمزايا استعمال أل

التي تخص موضوع واحد في حزمة procedure و البرامج الفرعية functionتجميع الدوال -١ Packageواحدة

الخاصة بهم فقط وال تحتاج لفتح كل packageيتم استعمال الدوال و البرامج الفرعية بفتح أل -٢ داله او برنامج فرعى على حدة

داخلها procedures أو function عند استدعاء داله packageيتم اإلشارة إلى اسم الحزمة -٣ بالشكل التالي

( ) package . function

و هذا األسلوب يعطى شيء من التنظيم

ج الخاصة بالدوال و البرام pl/sql يمكنك من إخفاء نصوص أوامر package إنشاء و استعمال أل -٤ الفرعية حيث يمكنك ترجمتها و استعمالها دون الرجوع لنص البرنامج

سهوله عمليه الصيانة على الكود باستخدام الجزم -٥

و تتكون الحزم من جزئيين

و فيه يتم اإلعالن عن المتغيرات العامة و كذلك PACKAGE SPECIFICATIONالجزء األول و المقصود باإلعالن عنها اى PROCEDUREمج الفرعية و البرا FUNCTIONاإلعالن عن الدوال

Page 85: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٨٥ -

بالنسبة RETURN VALUEكتابه تعريف اى اسم الدالة و معاملتها و أنوعها و كذلك القيمة المرتجعة PL/SQLللدوال و ال يتم كتابه سطور أوامر

و الصيغة العامة إلنشاء الجزء األول هي

CREATE [OR REPLACE] PACKAGE package_name IS | AS Puplic type and item declarations subprogram specifications END package_name;

: الجزء الثاني

PACKAGE BODY) سطور الدوال(قسم األوامر

التي PL/SQL ألنة يحتوى على سطور أوامر PACKAGE BODYيسمى هذا القسم بجسم الحزمة لدوال و البرامج الفرعية فالقسم األول ما هو إال إعالن و تعريف ألسماء الدوال و لكن هذا القسم تتكون منها ا

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

بكتابه األمر التي تقوم بحساب هذه الضريبة فهذا ليس له معنى

و جسم الحزمة PACKAGE SPECIFICATIONو هذا ما يحدث بالضبط بالنسبة لعنوان الحزمة PACKAGE BODY

: و الصيغة العامة إلنشاء الجزء الثاني ما يلي

CREATE [OR REPLACE ] PACKAGE BODY package_name IS | AS Public type and item declarations Subprogram specifications End package_name ;

packageخطوات إنشاء حزمة الدوال

: يتم اإلنشاء بالخطوات التالية

package specificationإنشاء قسم التعريفات -١

و كذلك اإلعالن عن المتغيرات العامة procedures و أل functionم اإلعالن عن الدوال و فيه يت

Page 86: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٨٦ -

package body إنشاء جسم الحزمة -٢

pl/sqlو فيه يتم إنشاء الدوال و البرامج الفرعية التي تم اإلعالن عنها في قسم التعريفات و ذلك بكتابه أوامر

التي تحقق الغرض من الدوال

و لتوضيح ذلك سوف نقوم بعمل مثال بسيط

و يبدأ ذلك بإنشاء أل sql plus بسيطة بكتابه األوامر في بيئة أل packageهذا المثال يوضح كيفيه إنشاء package specification

بها اإلعالن عن الدوال و السطور simplepkg باالسم package specificationو بهذا تم إنشاء أل

package bodyاإلجراء السابق ) جسم(التالية تقوم بإنشاء سطور

Page 87: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٨٧ -

packageحذف أل

على خطوتين packageيتم إلغاء أل

وذلك بالصيغة التالية package specإلغاء أل : األولى

Drop package package_name;

package اى اسم أل package name ثم أل drop packageو فيه يتم استعمال األمر

package bodyف أل حذ: الثانية

و يتم باستعمال الصيغة

Drop package body package_name ;

اى اسم أل package name ثم أل Drop Package bodyفي هذه الصيغة يتم استعمال اآلمر Package و بالتالي يتم حذف إلى package body

overloadingإعداد أكثر من داله بنفس االسم

خاصية تسمى function أو الدوال procedureصائص المتاحة عند إنشاء اإلجراءات من الخ overloading و هي من الخصائص المشهورة في لغات البرمجة في مفهوم oop

(object oriented programming ) و معناه أمكانيه إنشاء أكثر من إجراء procedure أو داله function بنفس االسم بشرط اختالف المعامالت و يفيد ذلك بإنشاء كثير من الدوال التي تؤدى أغراض

متقاربة بنفس االسم

:و لتوضيح كيفيه إنشاء أكثر من داله بنفس االسم و كيف يتم التفرقة بينهم عند االستدعاء تابع المثال التالي

إنشاء تعريف الحزمة -ا

Page 88: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٨٨ -

إنشاء جسم الحزمة -٢

في هذه السطور يتم إنشاء جسم الحزمة و بالتالي إنشاء سطور الدوال المعرفة مسبقا في جزء التعريف حيث و الدالة الثانية VERSION 1 بمعامل واحد تعيد العبارة () TESTFUNيتم إنشاء الدالة

TESTFUNC() بمعاملين تعيد العبارة VERSION 2

: إنشائها نقوم بعمل االتى و لتجربه استدعاء هذه الدوال بعد

Page 89: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٨٩ -

one-time-only procedureإنشاء أل

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

فعلى سبيل المثال

في أول مرة و المشار tax_rates توضع كأنها قيمة في جدول أل taxفي هذا المثال القيمة الحالية للمتغير taxes_packageيها من قبل حزمة البرامج إل

one-time-only procedureو عندما نقوم بوضع المتغيرات على العام أو الخاص اتوماتيكيا باستخدام فعند إنشائها تكون معقدة جدا وذلك باستخدام تلك المتغيرات و في هذه الحالة اليجب أن نضع المتغيرات في

one-time-only procedure وضعها اتوماتيكيا في حاله جزء التعريف الن القيم يعاد

في حزم البرامج sqlالقيود الالزمة للدوال المستخدمة ب أل

يقوم االوراكل بتنفيذ جمل االستعالمات التي تتطلبها الدوال المخزنة و هي يجب أن تعرف في الجزء الغير رامج في قاعدة البيانات مؤثر الذي يقوم بتغيير جداول و متغيرات حزم الب

أما في الجزء المؤثر قد يؤجل عمليه تنفيذ االستعالم الذي يستسلم لألمر و يؤدى إلى نتائج غير معروفة أو تصليح حاله متغيرات حزم البرامج من قبل المستخدم

sqlل و إليك بعض القيود التي يجب أن توضع أو تطبق على الدوال المخزنة التي تنادى على متغيرات أ

Page 90: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٩٠ -

الدوال يجب أن ال تقوم بعمل تعديل في الجداول الموجودة على قاعدة البيانات فإذا قمت بتعديل · فإنك ال يمكنك أن تقوم بعمليات التعديل و الحذف و اإلدخال

رات حزم البرامج ال يمكن أن تنفذ بعيدا الدوال التي تقوم بقراءة و كتابه القيم من متغي · يمكن أن تكتب في قيم متغيرات حزم select , values ,setالدوال التي تنفذ بواسطة الكلمات ·

البرامج

pl/sql PARAGMA RESTRICT_REFERENCEفحص القيود في أل

فإذا كان تم كسر القواعد أم ال و دوال حزم SQLعلى جمله أل يقوم المستخدم بتعريف الدالة التي تنادى لعمل فحص إذا تم كسر القاعدة أم ال PARAGMA RESTRICT_REFERENCESالبرامج تستخدم

و لنقاء مستويات دوال حزم البرامج

PARAGMA RESTRICT_REFERENCESنستخدم

و الصيغة العامة لألمر هي

PARAGMA RESTRICT_REFERENCES ( function name, WNDS , [,WNPS] [,RNDS] [,RNPS]);

WNDS : تعنى انه لن يكتب اى حاله في قاعدة البيانات اى إننا ال يمكننا التغيير في جداول قاعدة البيانات للدالة

WNPS : ت الموجودة في تعنى انه لن يكتب اى حاله في حزمة البرامج وال يمكنك التغيير في قيم المتغيرا حزمة البرامج للدالة

RNDS : تعنى انه لن يقرا اى حاله في قاعدة البيانات و ليمكننا أن نقوم باالستعالم عن اى جدول في قاعدة البيانات للدالة

RNPS : تعنى انه لن يقرا اى حاله في حزم البرامج و ال يمكن إرجاع القيم للمتغيرات العامة في حزم دالة البرامج لل

تعيين مستوى النقاء للدالة في حزم البرامج عندما نقوم بإنشاء دوال في حزمة برامج

و يؤكد مستوى النقاء للدالة في حزمة البرامج مدى الدالة التي تسمح لعمليات قاعدة البيانات

و عندما تقوم بتعيين مستوى النقاء باستخدام المحلل أو المصنف

Page 91: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٩١ -

PRAGMA RESTRICT_REFERENCES

لفرض داله حزم البرامج بالقراءة أو الكتابة إلى الوصول PL/SQL تكلم محلل أل PRAGMAفإن أل إلى جدول قاعدة البيانات

يؤدى ذلك إلى انتهاك أل FUNCTION BODYو إذا كنت تحاول في تصنيف أو تحليل حسم الدالة PRAGMA و تعطى خطأ

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

PRAGMA RESTRICT_REFERENCES لدوال حزم البرامج

مثال

Page 92: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٩٢ -

في قاعدة البيانات البعيدة لذا أنت تحتاج إلى sqlو في هذا المثال نجد أن الدالة تنادى على عبارات أل باستخدام PRAGMA RESTRICT_REFERENCESالتصريح على نقاء الدالة باستخدام األمر

الن الدالة البعيدة يمكن أن ال تقوم بقراءة و كتابة متغيرات الحزم وال RNPS,WNPS,WNDSالمستويات و لو أن حزم البرامج تحتوى على عدة دوال SQLفي جداول قاعدة البيانات عندما نستدعى عبارات أل

بتطبيق آخر داله PRAGMAبنفس االسم تقوم أل

االستعالمات و يمكننا إحضار أو استرجاع دوال حزم البرامج في جمل

كما سنرى في هذا المثال

:األحداث على قاعدة البيانات

تنفذ مع عملیات أل Pl/sql وھي عبارة عن جمل أل Triggerتسمى األحداث على قاعدة البیانات باالسم DML وعملیات أل DML كما تعرفنا سابقا عبارة عن (Insert,Update,Delete) ونالحظ أن ھذه الجمل

ات أو قاعدة البیانViewتكون مرتبطة بالجداول أو أل

بصوره تلقائیة دون تدخل من المبرمج أو المناداة علیھا داخل الكود Triggerویتم تنفیذ ھذه الجمل أو أل داخل الكودFunction أو أل Procedureالمكتوب مثل المناداة على أل

:ویوجد نوعان من األحداث التي یتم تنفیذھا

١-Application trigger:

موجودة على أل DMLتطبیقھ على حدث ھذا الحدث یحتوي على جمل یتم Triggerوھي عبارة عن Applicationمثل ألForms

Page 93: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٩٣ -

٢- Database trigger:

التي تحدث على البیانات الموجودة في الجدول مثل أضافھ صف أو DML على أحداث أل Triggerیتم تنفیذ أل التعدیل في صف أو حذف صف

إذا حدثت أحداث معینھ على قاعدة البیانات مثل الدخول على قاعدة البیانات ویتم أیضا تنفیذ ھذه األحداث أیضا (Logon) أو (Logoff)

Create, Alter عبارة عن DDL وال Trigger مع أل DDLویتم السماح باستخدام جمل أل

متى یتم تنفیذ ھذه األحداث ؟:ولكن السؤال ھو

تحدید وقت حدوث الحدث حیث انھ یتم تحدید ما إذا كانت ھذه الجمل یتم تنفیذ ھذه األحداث كیفما یقوم المستخدم ب تنفذ قبل أو بعد ھذه األحداث وسنتعرف اآلن على توقیت حدوث DMLالبرمجیة التي تحتوي على جمل أل

:الحدث

After : ومعناھا انھ یتم تنفیذ الحدث بعد مثال عملیھ االضافھ أو التعدیل أو الحذف في الجدول

Before : ومعناھا انھ یتم تنفیذ الحدث قبل حدوث عملیات ألDML على الجدول مثل قبل االضافھ في الجدول أو قبل عمل تعدیل في الجدول أو قبل عمل حذف في الجدول

٣-Instead of: یتم استخدامInstead of ومعناھا بدال من احد عملیات DML في الجدول وتستخدم لتحسین فقطView ویتم استخدامھا مع أل في الجدولDMLعملیات أل

وسیتم الحقا معرفھ كل من ھذه األنواع بالتفصیل

؟Triggerولكن السؤال ھو لماذا نقوم بإنشاء

إذا أردنا بعد عملیھ معینھ مثل االضافھ أو التعدیل أو الحذف من الجدول یحدث حدث Triggerیتم إنشاء -١ داخل الجدول على الصفوف Loopمعین ولیكن مثال حدث عمل

تم تكوینھم سابقا فیتم المناده علیم Function أو Procedure أن ننادي على Triggerمن الممكن داخل أل -٢ وذلك للتسھیل حتى ال یكون الكود طویل Triggerداخل أل

:Triggerواآلن سوف نتعرف على الصیغة العامة لتكوین أل

Trigger Create or replace triggerاسم أل

Timing event on table

واسم الجدول المراد تنفیذ الحدث والحدث المطلوب تنفیذ الحدث إما قبلھ أو بعدهTimingوقت تنفیذ الحدث علیھ

Pl/sql Trigger bodyكود

وبھذا نكون قد تعرفنا على ماھو الحدث وكیفیھ عملھ ومم یتكون

Page 94: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٩٤ -

Triggerواآلن سنتعرف على أليه عمل أل

: عليها Triggerيوجد أنواع يتم تنفيذ أل

:Statement على أل Trigger يتم تنفيذ أل -١

حيث أن االمثله السابقة ال تعتمد على Trigger هي انه اليوجد صفوف تتأثر بال Statementومعنى أل مره واحده trigger body حيث انه يتم تنفيذ الكود المكتوب في Statementالصفوف ولكن تعتمد على أل

فقط وال يتم تكراره

:Row على الصفTriggerيتم تنفيذ أل -٢

على Trigger body ويتم تكرار الكود المكتوب داخل أل Triggerومعنى هذا انه توجد صفوف تتأثر بال كل صف من الصفوف

ولكن Statement على مستوى أل Trigger على مستوى الصف تختلف عن كتابه ألTriggerوكتابه أل االختالف يكون بسيط

وسنرى هذا االختالف في االمثله التي سيتم ذكرها الحقا

ولكن البد أن نعرف كيف يتم تسلسل تنفيذ األحداث داخل الكود؟

:يتم التسلسل كاآلتي

-trigger Before statement 1قبل الجملة التي ينفذ عليها أل

Trigger 2-Before row triggerقبل الصف الذي ينفذ عليه أل

trigger 3-after row triggerبعد الصف الذي يتم تنفيذ أل

trigger 4-After statementبعد الجملة التي ينفذ عليها أل

بها Triggerوهذه هي االليه التي يتم تنفيذ أل

Statement التي تنفذ على مستوى أل Triggerوسنقوم اآلن بإعطاء أمثله ل

Statement على مستوى أل Triggerنفيذ أل ت:أوال

:نضيف أوال صف إلى الجدول كما سنرى في هذا المثال

Page 95: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٩٥ -

:مثال

في الجدول وبالتالي تمت أضافه الصف في الجدول وعلى هذه االضافه سيتم توضيح Insertعند عمل أوال على هذا الصفTriggerإليه عمل أل

معين تم تكوينه سابقاTrigger التي تتأثر ب على مستوى الجملةTriggerيبين هذا المثال كيفيه تنفيذ أل

كما هو موضح Trigger أوال على أل جمله ثم ثانيا على الصف الذي يتأثر بال Triggerفيتم تنفيذ أل بالشكل

Triggerوسنتعرف فيما يلي على كيفيه تكوين

:مثال

Page 96: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٩٦ -

يتم تنفيذه هذا الحدث قبل عمل أي تعديل Trigger هذا ألAgc2 يسمى Triggerفي هذا المثال تم تكوين فعند حدوث أي تعديل في Triggerفي الجدول وهذا يسمى بوقت الحدث والحدث الذي يحدث عنده تنفيذ أل

على الجدول Insert بتنفيذ جمله أل الجدول يقوم أوال

: نتبع اآلتيTriggerوللتأكد من عمل أل

Page 97: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٩٧ -

٦=لذين أسماؤهم احمد ومعناها التعديل في الجدول بجعل أرقام الطالب الUpdateنكتب جمله

المكتوب انه يكون قد تمت االضافه أوال في الجدول قبل عمل التعديل في Triggerالمفروض انه حسب أل :الجدول ولنتأكد من ذلك

Page 98: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٩٨ -

الفعل تمت االضافه في الجدول أوال قبل عمل التعديل كما هو باين في هذا المثال وبعد ذلك حدث التعديلب

أن يحدث تداخل بين مجموعه من األحداث مثل االضافه والتعديل والحذفTriggerمن الممكن داخل أل

:مثال يبين التداخل بين األحداث

Page 99: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ٩٩ -

هذا الحدث يتم تنفيذه قبل عمل أضافه أو تعديل أو حذف AGCجديد يسمى Triggerفي هذا المثال تم تكوين بين هذين التاريخين فلو حدث أضافه يظهر هذا الخطأ وإذا Sysdateفي الجدول ثم إذا كان تاريخ اليوم وهو

حدث تعديل يحدث هذا الخطأ وإذا حدث حذف يحدث هذا الخطأ وإال يحدث خطأ آخر وهذا يبين التداخل بين جمل أل

DML

Statement على مستوى أل Triggerوبهذا نكون قد انتهينا من تطبيق أل

:Rowمستوى الصف ولكن على Triggerتكوين : ثانيا

:الصيغة العامة لها هي

Trigger Create or replace triggerاسم أل

Triggerأمر تكوين

Timing

وقت حدوث الحدث

Event on table

Page 100: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٠٠ -

(reference old as old/new as new) إلعطاء Reference ويتم استخدام األحداث التي تتم على سواء االضافه أو الحذف أو التعديل في الجدول

أسماء للقيم القديمة والقيم الجديدة المراد استخدامهاFor each row

لكل صف من صفوف الجدول

When(condition)

إال إذا تم هذا الشرطTriggerأي ال يتم تنفيذ أل

:القديمة والجديدة بالنسبة للتعامل مع القيم

و التعديل فانه قد تحتاج إلى التعامل مع القيم القديمة قبل إلغائها في حاله إنشاء أحداث خاصة بعمليه الحذف أ New أو Oldأو قبل التعديل فيها وذلك يتم باستخدام الكلمتان

التي تنفذ على مستوى الصف هي التي يمكن أن يأتي معها أل قيم القديمة Triggerنالحظ انه بالنسبة لل Oldوالقيم الجديدة New

Statement على مستوى الجملTrigger عندما يتم تنفيذ أل new أو الكلمة oldدام الكلمة وال يصح استخ

:مثال

Page 101: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٠١ -

معناها أن أل For each rowث أن الجملة على الصف حيTriggerهذا المثال هو مثال لتطبيق أل Trigger يتم تنفيذه على كل صف من الصفوف في الجدول ثم تم استخدام جمله شرطيه وهي When

إال إذا تم تنفيذ هذا الشرط أوال وهو أن Triggerوالهدف من استخدام هذه الجملة انه ال يتم تشغيل هذا أل يكون رقم الطالب القديم

هذا الكود معناه انه لو رقم Begin ثم تمت كتابه كود داخل أل Triggerسمى القيود على أل وهذه ت١= ألنه تم تعريف المتغير في الخارج فيعتبر المتغير انه : ونالحظ انه تم استخدام العالمة ٣=الطالب القديم

Host variable فادا تحقق هذا الشرط

٣١٠= لم يتحقق هذا الشرط يكون ثمن الدورة وإال إذا٣٢٠=يجعل ثمن الدورة الجديد

لتنفيذ When وأيضا تم استخدام الشرط New, Oldونالحظ في هذا المثال انه تم استخدام كال من الكلمتين هذا الحدث

:مثال آخر يبين كيفيه التعامل مع القيم القديمة والجديدة

في الجدول ويتم Insert قبل عمل Trigger يتم تنفيذ هذا أل agc3 اسمه Trigger في هذا المثال تم تكوين إذا تحقق هذا Trigger ولكن يتم تنفيذ هذا أل على كل صف موجود في الجدولTriggerتنفيذ هذا أل

ثم تم كتابه الكود ومعناه إذا حدث أضافه في الجدول يكون رقم الدورة ١=الشرط وهو أن يكون رقم الطالب ٣١٠= وإال يكون ثمن الدورة الجديد ٣٢٠=الجديد

بالنسبة للصف وبالنسبة للجمل كلها Triggerوبهذا نكون قد تعرفنا على كيفيه تكوين

Page 102: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٠٢ -

Triggerقيم الجديدة داخل أل وكيفيه استخدام القيم القديمة وال

على مستوى الجداول فقط ولكنTriggersفي كل االمثله السابقة تم التعامل مع الجداول وتكوين

؟Table بالنسبة لTriggerعن تكوين مختلفةView على مستوى أل Triggerهل أل

عديل في جدول معين فان الجدول يأخذ بياناته من جدولين مختلفين فعند عمل تview ا فرضنا أن هذا أل فيه وهذا يؤدي إلى حدوث خطا لذلك يتم في حاله أل Insertيقوم بالتعديل في جدول وفي األخر يقوم بعمل

View استخدام Instead of التي تمكن أل view من عمل Insert دون حدوث مشاكل

تخدم بالنسبة للجداول السابق المسTrigger يكون مختلف عن ألTriggerوبالتالي فان أل

Instead ofواآلن سيتم توضيح مثال يبين كيفيه استخدام

:Viewنقوم بإنشاء :أوال

البيانات الموجودة في الجدولين الطالب وجدول الدورات وتم وضع بداخله Ihab باسم Viewتم إنشاء الدراسية

Viewإظهار بيانات أل :ثانيا

Page 103: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٠٣ -

View إلظهار البيانات في أل

Viewداخل أل Insertعند عمل :ثالثا

Page 104: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٠٤ -

يأخذ البيانات من جدولين مختلفينView تم حدوث خطا الن أل Viewعند االضافه داخل أل

instead ofوللتغلب على هذه المشكلة نستخدم

Page 105: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٠٥ -

وذلك View وهي معناها بدال من عمليه الحذف على الInstead ofتم التغلب على هذه المشكلة باستخدام لكل صف من الصفوف ثم بعد ذلك يحدث أضافه في الجدول

Viewبهذا نكون تغلبنا على المشكلة الخاصة بال و

أو تشغيلهTriggerإليقاف تشغيل أل

ثم اسم ال Alter triggerيستخدم هذا األمر لتشغيل أو عدم تشغيل الحدث حيث انه يتم كتابه األمر Trigger

ومعناها غير شغالDisable أو ومعناها شغالEnableويكتب بعدها

لجدول لتشغيل أو إيقاف األحداث الموجودة في ا

Page 106: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٠٦ -

:كما في المثال اآلتي

ومعناها غير شغالDisable أو نكتب ومعناها شغالEnable ثم اسم الجدول ونكتب Alterنكتب األمر

وبهذا نكون قد Compile ثم نكتب Trigger ثم اسم أل Alterث نقوم بكتابه األمر إذا أردنا ترجمه الحد أعدنا ترجمه الحدث

Triggerثم اسم أل Dropولحذف الحدث نستخدم األمر

Page 107: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٠٧ -

بحمد اهللا تم

وتریشرح ھذا الكتاب علي صفحات موقع المجموعة العربیة للكمبتم

إبراھیم محمد ابوطالب معجالغالف و تتصمیم

الدكتور عمرو موسياألستاذ من كتابیةإال بموافقة منعًا باتًا نسخ ھذا الكتاب یمنع

عبر االنترنتاألكاديميةموقع زوروا

www.agcacademy.com

الحقوق محفوظة للمجموعة العربية للكمبيوترجميع

Page 108: تعليم اوراكل

المجموعة العربية للكمبيوترإعداد PL/SQL كتاب

- ١٠٨ -