PL/SQL الدرس الأول من لغة |
تعليم أوراكل للعرب |
لغة الإجراءات لبرمجة أوراكل
تعتبر هذه اللغة هي لغة برمجية بغض النظر عن جمل الاستعلامات فهذه لغة استعلامات وهذه لغة برمجية ويمكنك من طريقها عمل الإجرائيات المخزنة والوظائف ويمكنك استخدام أوامر وجمل جمل الاستعلام داخلها إذ أنها وضعت بالأساس لمعالجة بيانات معينة يتم الحصول عليها من قاعدة بيانات أو عند إدخالها كمعطيات لتغذية هذه القاعدة ومن الممكن اعتبار أن الإجرائيات هي عبارة عن كتل برمجية مستقلة من الممكن أن يتم استدعاء أي منها أو أكثر من كتلة في عدة إجراءات لعمل عمليات معينة متخصصة في كل إجرائية ولشرح مبسط عن ذلك إليك هذا المثال
لنفرض أننا قمنا بإنشاء إجرائية تقوم بحساب مجموع رواتب الموظفين وإجرائية أخرى تقوم باقتطاع التأمين الصحي من الرواتب وإجرائية أخرى تقوم بعمل الخصومات وأخرى تقوم بحساب المكافئات فيمكننا استخدام كل من هذه الإجرائيات على حدى للقيام بعملية معينة كما ويمكننا عمل إجرائية تقوم باستدعاء هذه الإجرائيات واحد تلو الأخر لكي تقوم بالنهاية بإعطائنا النتائج المطلوبة
ميزات الإجراءات
عدم تكرر الأوامر في أكثر من زناد وإجرائية بحيث نتمكن من استدعاء كل إجرائية معدة مسبقا مرة واحدة
سهولة إصلاح وتتبع الأخطاء بحيث نقوم بتعديل إجرائية واحدة فيتم إصلاح جميع الإجرائيات التي تقوم عليها بدلا من إصلاح كل إجرائية على حدى
تمكين عدة أشخاص من عمل مشروع مشترك بحيث ليس من الواجب أن تتفق الأفكار البرمجية لكل المبرمجين بحيث يقوم كل شخص بعمل إجرائية لأداء وظيفة معينة ثم يقوم شخص ما بتجميع هذه الإجرائيات لبناء المشروع كاملا
كما وأن هناك من الميزات الأخرى ولكن هذه هي أهم الميزات التي وضعت لأجلها هذه الإجراءات
كما وإن لغة الإجراءات من الممكن أن تستخدم في نفس قاعدة البيانات أي ككتل مضافة لنظام قاعدة البيانات أو يمكن إعدادها في محرر وباني الإجرائيات أو من الممكن أن نستخدمها لبرمجة الأحداث في الديفلوبر في تصميم النماذج حيث أن برمجة الأحداث هي برمجة تقوم بإصدار حدث معين عند قيام المستخدم بعمل معين مثلا عند القيام على ضغط زر أو عند القيام بإدخال بيانات في مربع نصي وغيرها من الأحداث الكثيرة ويوجد الكثير من هذه الأحداث التي تتشابه فيما بينها في الخواص مثل حدث النقر والنقر المضاعف والمرور بالفأرة فوق الأداة أو ضغط زر أو كتابة جملة وغيرها من الأحداث والتي من الممكن أن نختلف بعضها من أداة لأخرى على حسب وظيفتها
الفرق بين الإجرائية والوظيفة
الأسم |
الفرق |
الوصف |
Procedure |
لا تقوم بإعادة قيمة |
إجرائية |
Function |
تقوم بإعادة قيمة |
وظيفة |
كيف يتم استخدام هذه الإجرائيات
يتم استخدام هذه الإجرائيات كا إجرائيات مخزنة داخل كائن داخل قاعدة البيانات لاستدعائها عن طريق جملة استعلام أو من الممكن أن نضعها كزناد يحدث عند حدوث أي عمل ما على جدول أو أي كائن مرتبط بهذا الزناد كما وأنك تحتاجها للقيام ببرمجة الديفلوبر في الواجهة الرسومية وهي كالأحداث الموجودة في لغة الفيجوال بيسك ولغة السكريبت فيقوم بتنفيذ إجراء معين يطلق عليه اسم الزناد عند حدوث أي حدث على قاعدة البيانات بشكل عام أو على أي كائن موجود في قاعدة البيانات وفي داخل الأدوات الموجودة في الديفلوبر كأداة الزر مثلا
كيف نقوم ببناء الإجرائية
يمكنك بناء الإجرائيات بعدة طرق منها عن طريق مستكشف أوراكل ولمعرفة ذلك قم بالنقر
هنا
ويمكنك ذلك عن طريق أداة مرفقة مع الديفلوبر تسمى
Procedure Builder – Line mode
أو عن طريق أداة رسومية أخرى تسمى
Procedure Builder
وهي ذات واجهة رسومية تقوم بتمكينك من تجربة الإجرائية ومعرفة الأخطاء وإصلاحها ولمعرفة كيف يمكن التعامل مع الإجرائية قم بالنقر
هنا
كما ويمكنك ذلك عن طريق محرر الاستعلامات
بنية الأجراء
تعتمد الإجراءات على تقسيم نفس الأجراء إلى عدة أقسام وهي
قسم التعريف
في هذا القسم يتم تعريف نوع الأجراء هل هي وظيفة أو إجرائية ويتم تعريف أنواع وأسماء المتحولات التي يتم التعامل معها في الإجرائية
جسم الأجراء
يعتبر جسم الأجراء هو لب هذه الإجراءات والذي يتم فيه كل العمليات البرمجية كما ويمكنك إدخال بنية إجرائية أخرى داخله
معالجة الأخطاء
هذا القسم يقوم بعمل مصيدة للأخطاء المتوقعة والغير متوقعة والذي يتم تعريفها وصيادة هذا الخطاء ومعالجته وتوجيهه للقيام بأعمال معينة على أساس الخطاء القادم
مثال
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; |
مثال
Funcation CountSal Return NewSal is
Mm number;
Begin
Mm=Select sal * 1.2 from emp;
NewSal = Mm
Exception
End;
هذا المثال غير عملي ولكنه يقوم بتعريف البنية الرئيسية للوظيفة
لنقم بالقيام بمثال عملي يمكنك تطبيقه عمليا مع شرح لخطوات العمل لكي يتسنى لنا المواصلة في هذا الموضوع
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;
قمنا هنا في جسم الأجراء بفتح المؤشر وهذا لكي يتم تنفيذ جملة الاستعلام ووضع القيم في داخله ثم قمنا ببدء حلقة لكي تقوم بالمرور على جميع القيم الموجودة داخل هذا المؤشر وقمنا بوضع هذه القيم داخل المتحول الذي قمنا بتعريفه ثم قمنا بعمل مصيدة للخطاء وهي تقوم بالخروج من الحلقة في حال انتهت الحلقة من المرور على جميع البيانات الموجودة داخل المؤشر ثم قمنا بإغلاق الحلقة وإغلاق المؤشر وانتهينا من الأجراء
بعد المرور على هذا المثال البسيط يجب علينا أن تعرف على كيفية تعريف متغيرات وثوابت داخل قسم الإجراءات
Constant
لتعريف ثابت لا يتغير عند الانتهاء من الأجراء بل تبقى القيمة كما هي
Declare
:Global.kk := 1;
Public
لتعريف متغيير عام يقوم البرنامج وجميع الإجرائيات باستخدامه
Declare
:Global.kk ;
Normal
لتعريف قيم تستخدم في الأجراء وتنتهي عن الانتهاء من الأجراء
Declare
MMM_Salary Salary%Rowtype;
MMM_ID Salary.ID%Rowtype;
في المتغيرين السابقين قمنا بتعريف متغير يحتوي على جدول ومتغير أخر يحتوي على حقل معين من جدول
Declare
MM_Salary Number(10);
MM_Date Date;
MM_Name Varchar2(20);
هذه مثال على كيفية تعريف متغيرات عادية
بقي علينا معرفة كيفية التعامل مع هذه المتغيرات من حيث الإسناد والحصول على النتائج
MM := 12 ; |
إعطاء قيمة |
:MM := B ; |
وضع قيمة داخل أخرى |
MM = 12 ; |
للمساواة |
:Global.KK + 1 ; |
التعامل مع المتغيرات العامة والثابتة |
لنقم الآن بالقيام بعمل مثال عملي أخر يضم ما تعلمناه سابقا
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
في حال لم يكن هناك أي سجلات
ترقبوا باقي الدروس قريبا بإذن الله