PL/SQL الدرس الأول من دروس لغة الأجرائات

لغة الإجراءات لبرمجة أوراكل

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

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

ميزات الإجراءات

عدم تكرر الأوامر في أكثر من زناد وإجرائية بحيث نتمكن من استدعاء كل إجرائية معدة مسبقا مرة واحدة

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

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

كما وأن هناك من الميزات الأخرى ولكن هذه هي أهم الميزات التي وضعت لأجلها هذه الإجراءات

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

الفرق بين الإجرائية والوظيفة 

 

الأسم

الفرق

الوصف

Procedure

لا تقوم بإعادة قيمة

إجرائية

Function

تقوم بإعادة قيمة

وظيفة

كيف يتم استخدام هذه الإجرائيات 

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

كيف نقوم ببناء الإجرائية

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

هنا

ويمكنك ذلك عن طريق أداة مرفقة مع الديفلوبر تسمى

Procedure Builder – Line mode

أو عن طريق أداة رسومية أخرى تسمى

Procedure Builder

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

هنا

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

هنا 

بنية الأجراء

تعتمد الإجراءات على تقسيم نفس الأجراء إلى عدة أقسام وهي

قسم التعريف

في هذا القسم يتم تعريف نوع الأجراء هل هي وظيفة أو إجرائية ويتم تعريف أنواع وأسماء المتحولات التي يتم التعامل معها في الإجرائية

جسم الأجراء

يعتبر جسم الأجراء هو لب هذه الإجراءات والذي يتم فيه كل العمليات البرمجية كما ويمكنك إدخال بنية إجرائية أخرى داخله

معالجة الأخطاء

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

مثال1

Function

Procedure

Function FunName Return Name is

Mm number;

Begin

Select * from emp;

Exception

End;

Procedure ProcName is

Mm number;

Begin

Select * from emp;

Exception

End;

مثال2

 

Funcation CountSal Return NewSal is

Mm number;

Begin

Mm=Select sal * 1.2 from emp;

NewSal = Mm

Exception

End;

هذا المثال غير عملي ولكنه يقوم بتعريف البنية الرئيسية للوظيفة 

لنقم بالقيام بمثال عملي يمكنك تطبيقه عمليا مع شرح لخطوات العمل لكي يتسنى لنا المواصلة في هذا الموضوع

مثال 3

Declare

Cursor C1 is

Select empno,empname,sal from emp;

ST emp%Rowtype

قمنا هنا بالبدء في قسم تعريف الأجراء وقمنا بتعريف مؤشر ووظيفة المؤشر هي كمحزن لمجموعة من البيانات التي يتم الحصول عليها بناء على جملة استعلام محددة

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

Begin

Open C1;

Loop

Fetch C1 Into

St.empno , st.empname, st.sal;

Exit when C1%notfound;

End Loop;

Close C1;

End;

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

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

تعريفا المتغيرات داخل الاجراء

الطريقة

النوع

الوصف

:Global.kk := 1;

Constant

لتعريف ثابت لا يتغير عند الانتهاء من الأجراء بل تبقى القيمة كما هي

:Global.kk ;

Public

لتعريف متغيير عام يقوم البرنامج وجميع الإجرائيات باستخدامه

MMM_Salary Salary%Rowtype;

MMM_ID Salary.ID%Rowtype;

Normal

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

MM_Salary Number(10);

MM_Date Date;

MM_Name Varchar2(20);

Normal

لتعريف قيم تستخدم في الأجراء وتنتهي عن الانتهاء من الأجراء

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

 

الطريقة

الوصف

MM := 12 ;

إعطاء قيمة

:MM := B ;

وضع قيمة داخل أخرى

MM = 12 ;

للمساواة

:Global.KK + 1 ;

التعامل مع المتغيرات العامة والثابتة

لنقم الآن بالقيام بعمل مثال عملي أخر يضم ما تعلمناه سابقا

مثال4

Declare

Cursor C1

Select empno,ename,sal From emp;

Cursor C2

Select amunt From add Where empno = empno;

Cursor C3

Select amunt From dept Where empno = empno;

Begin

Open C1;

Loop

Fetch C1 into Xempno,Xename,Xsal;

Exit when C1%notfound;

Tot_Add=0

Open C2;

Loop

Fetch C2 into Xamount;

Exit when C2%notfound;

Tot_Add := Tot_add + Xamount;

End loop;

Close C2;

Open C3;

Tot_ded = 0;

Loop

Fetch C3 into Xamount;

Exit when C3%notfound;

Tot_ded :=Tot_ded + xamount;

End loop;

Close C3;

Xnet_sal = Xsal + (Tot_add – Tot_ded)

Insert into New_emp

(empno,ename,sal,Tot_add,Tot_ded,Total)

Values

(Xempno,Xenqme,Xsal,Tot_add,Tot_ded,Xnet_sal);

End loop;

Close C1;

Exception

When ni_data_found then

Text_IO.Put line( ‘Data is Empty’);

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

بعض رسائل الخطاء المهمة

تعريف الخطاء

الوصف

When Others then

في حال كان هناك خطاء غير معرف

When Dup_val_on

في حال كان هناك قيم متكررة

When No_data_found

في حال عدم وجود بيانات

When Zero Divide

في حال القسمة على صفر

When Too_Many_Rows

في حال لم يكن هناك أي سجلات

ترقبوا باقي الدروس قريبا بإذن الله