Summary

هذا المستند عبارة عن دليل برمجة PL/SQL، وهو لغة برمجة إجرائية لـ Oracle. يغطي أساسياتها، وأنواع البيانات، والإجراءات، والوظائف، وأمثلة على الاستخدام. تعلم لغة البرمجة PL/SQL لتتمكن من الاستفادة الكاملة من قدرات قاعدة البيانات.

Full Transcript

ABOULFATEH AL-DHABEI PL/SQL ‫‪PL/SQL‬‬ ‫ما هي لغة ‪PL/SQL‬؟‬ ‫‪ PL/SQL‬هي لغة برمجة متقدمة اختصارا...

ABOULFATEH AL-DHABEI PL/SQL ‫‪PL/SQL‬‬ ‫ما هي لغة ‪PL/SQL‬؟‬ ‫‪ PL/SQL‬هي لغة برمجة متقدمة اختصارا ً ‪Procedural Language/Structured Query Language‬‬ ‫و امتداد للغة )‪.SQL (Structured Query Language‬طورتها شركة ‪ Oracle‬لتوفير قدرات برمجة إجرائية أقوى داخل‬ ‫بيئة قواعد البيانات العالئقية‪.‬بمعنى آخر‪ ،‬فهي تسمح لك بإنشاء برامج أكثر تعقيدًا من مجرد كتابة استعالمات ‪ SQL‬البسيطة‪.‬‬ ‫لماذا نستخدم ‪PL/SQL‬؟‬ ‫التحكم في المعامالت‪ :‬تسمح لك ‪ PL/SQL‬بتجميع عدة عمليات ‪ SQL‬داخل كتلة واحدة (بلوك)‪ ،‬وبالتالي التحكم في المعامالت‬ ‫ ‬ ‫بشكل أفضل‪.‬يمكنك إجراء عدة تغييرات على قاعدة البيانات ضمن معاملة واحدة‪ ،‬وإما تأكيد جميع التغييرات أو إلغائها جمي ًعا في‬ ‫حالة حدوث خطأ‪.‬‬ ‫إجراء عمليات حسابية معقدة‪ :‬يمكنك تنفيذ عمليات حسابية معقدة‪ ،‬واتخاذ قرارات بنا ًء على نتائج هذه الحسابات‪ ،‬وتكرار عمليات‬ ‫ ‬ ‫معينة باستخدام حلقات‪.‬‬ ‫تخصيص قاعدة البيانات‪ :‬يمكنك إنشاء إجراءات مخزنة (‪ )stored procedures‬ودوال (‪ )functions‬لتأدية مهام محددة‪ ،‬مما‬ ‫ ‬ ‫يزيد من كفاءة قاعدة البيانات ويقلل من تكرار الكود‪.‬‬ ‫التفاعل مع المستخدم‪ :‬يمكنك إنشاء واجهات مستخدم بسيطة للتفاعل مع المستخدم‪ ،‬مثل عرض رسائل أو طلب إدخال بيانات‪.‬‬ ‫ ‬ ‫البرمجة الشيئية‪ :‬تدعم ‪ PL/SQL‬بعض مفاهيم البرمجة الشيئية‪ ،‬مثل الكائنات والوراثة‪ ،‬مما يجعلها لغة أكثر مرونة وقوة‪.‬‬ ‫ ‬ ‫ميزات‪PL/SQL:‬‬ ‫لغة إجرائية ‪ :‬توفر ‪ PL/SQL‬بنية تحكم إجرائية مثل الحلقات والشروط والدوال‪ ،‬مما يتيح كتابة برامج معقدة‬ ‫ ‬ ‫ومنظمة‪.‬‬ ‫تكامل ‪ : SQL‬يمكن تضمين أوامر ‪ SQL‬مباشرة داخل برامج‪ ، PL/SQL‬مما يسهل استرجاع وتحديث البيانات‪.‬‬ ‫ ‬ ‫أمان البيانات ‪ :‬توفر ‪ PL/SQL‬آليات أمان مدمجة تساعد في حماية البيانات وضمان سالمتها‪.‬‬ ‫ ‬ ‫أدوات تطوير متكاملة ‪ : Oracle‬توفر أدوات تطوير متقدمة لكتابة واختبار وتصحيح برامج‪PL/SQL.‬‬ ‫ ‬ ‫سن ‪ :‬يمكن تحسين أداء االستعالمات والبرامج باستخدام ‪ PL/SQL‬من خالل تنفيذها داخل قاعدة البيانات‪.‬‬‫أداء مح ّ‬ ‫ ‬ ‫مكونات أساسية في ‪:PL/SQL‬‬ ‫الكتلة (‪ :)Block‬هي الوحدة األساسية للبرنامج في ‪.PL/SQL‬تتكون من قسم اإلعالن (‪ ،)declaration section‬وقسم‬ ‫ ‬ ‫التنفيذ (‪ ،)execution section‬وقسم االستثناءات (‪.)exception section‬‬ ‫المتغيرات والثوابت‪ :‬تستخدم لتخزين القيم بشكل مؤقت خالل تنفيذ البرنامج‪.‬‬ ‫ ‬ ‫أنواع البيانات‪ :‬تدعم ‪ PL/SQL‬مجموعة متنوعة من أنواع البيانات‪ ،‬مثل األعداد‪ ،‬النصوص‪ ،‬والتاريخ‪.‬‬ ‫ ‬ ‫العمليات الحسابية‪ :‬يمكنك إجراء عمليات حسابية أساسية مثل الجمع والطرح والضرب والقسمة‪.‬‬ ‫ ‬ ‫الجمل الشرطية‪ :‬تستخدم التخاذ قرارات بنا ًء على شروط معينة (مثل ‪.)IF-THEN-ELSE‬‬ ‫ ‬ ‫الحلقات‪ :‬تستخدم لتكرار مجموعة من األوامر عدة مرات (مثل ‪.)WHILE loop ،FOR loop‬‬ ‫ ‬ ‫اإلجراءات والمهام‪ :‬هي برامج مخزنة يمكن استدعاؤها من أي مكان في قاعدة البيانات‪.‬‬ ‫ ‬ ‫الدوال‪ :‬هي برامج مخزنة تعيد قيمة واحدة‪.‬‬ ‫ ‬ ‫أمثلة على استخدام ‪:PL/SQL‬‬ ‫تحقق من صحة البيانات المدخلة‪ :‬قبل حفظ البيانات في قاعدة البيانات‪ ،‬يمكنك التحقق من صحتها للتأكد من أنها تتوافق مع القواعد‬ ‫ ‬ ‫المحددة‪.‬‬ ‫إنشاء تقارير معقدة‪ :‬يمكنك إنشاء تقارير مخصصة تجمع البيانات من مصادر مختلفة وعرضها في شكل جذاب‪.‬‬ ‫ ‬ ‫أتمتة المهام‪ :‬يمكنك أتمتة مهام متكررة‪ ،‬مثل إرسال رسائل بريد إلكتروني أو تحديث البيانات بشكل دوري‪.‬‬ ‫ ‬ ‫تحسين أداء قاعدة البيانات‪ :‬يمكنك استخدام ‪ PL/SQL‬لكتابة كود أكثر كفاءة‪ ،‬مما يؤدي إلى تحسين أداء قاعدة البيانات‪.‬‬ ‫ ‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫لماذا تتعلم ‪ PL/SQL‬؟‬ ‫إذا كنت تعمل مع قواعد بيانات ‪ ،Oracle‬فإن تعلم ‪ PL/SQL‬يعتبر ضروريًا لكي تتمكن من‪:‬‬ ‫االستفادة الكاملة من قدرات قاعدة البيانات‪ :‬يمكنك إنشاء تطبيقات أكثر تعقيدًا ومرونة‪.‬‬ ‫ ‬ ‫تحسين أداء التطبيقات‪ :‬يمكنك كتابة كود أكثر كفاءة‪.‬‬ ‫ ‬ ‫تخصيص قاعدة البيانات‪ :‬يمكنك تكييف قاعدة البيانات لتلبية االحتياجات الخاصة لتطبيقك‪.‬‬ ‫ ‬ ‫أمثلة على استخدام‪PL/SQL:‬‬ ‫كتابة إجراءات مخزنة لتنفيذ مهام محددة داخل قاعدة البيانات‪.‬‬ ‫ ‬ ‫إنشاء وتنفيذ استعالمات معقدة تتضمن التحكم في التدفق والشروط‪.‬‬ ‫ ‬ ‫تطوير تطبيقات ويب متكاملة تعتمد على قواعد البيانات‪.‬‬ ‫ ‬ ‫أساسيات‪PL/SQL:‬‬ ‫‪.1‬الكتل ‪:‬الكتلة هي الوحدة األساسية في ‪ PL/SQL‬وتتكون من‪:‬‬ ‫‪ o‬جمل تهيئة )‪(declarations‬‬ ‫‪ o‬جمل التنفيذ )‪(execution‬‬ ‫‪ o‬جمل المعالجة االستثنائية )‪(exception handling‬‬ ‫‪PL/SQL Block‬‬ ‫)‪Declaration Section (Optional‬‬ ‫قسم اإلعالن (اختياري)‬ ‫‪Variable Declarations‬‬ ‫إعالنات المتغيرات‬ ‫‪Execution Section‬‬ ‫قسم التنفيذ‬ ‫‪SQL Queries/Statements‬‬ ‫استعالمات‪/‬عبارات ‪SQL‬‬ ‫‪Procedural Logic‬‬ ‫المنطق اإلجرائي‬ ‫‪Exception Handling Section‬‬ ‫قسم معالجة االستثناءات‬ ‫‪Error Handling Logic‬‬ ‫منطق معالجة األخطاء‬ ‫مثال‪-:‬‬ ‫‪DECLARE‬‬ ‫;'!‪v_message VARCHAR2(50) := 'Hello, PL/SQL‬‬ ‫‪BEGIN‬‬ ‫;)‪DBMS_OUTPUT.PUT_LINE(v_message‬‬ ‫‪EXCEPTION‬‬ ‫‪WHEN OTHERS THEN‬‬ ‫;)'‪DBMS_OUTPUT.PUT_LINE('An error occurred.‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫طريقة مختصرة‬ ‫‪BEGIN‬‬ ‫جمل التنفيذ –‬ ‫;)'!‪DBMS_OUTPUT.PUT_LINE ('Hello, World‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫‪.2‬اإلجراءات والوظائف ‪:‬يتم إنشاء اإلجراءات والوظائف إلعادة استخدام األكواد وتنفيذ العمليات المعقدة‪.‬مثال على‬ ‫إجراء بسيط‪:‬‬ ‫‪CREATE OR REPLACE PROCEDURE greet (name IN VARCHAR2) IS‬‬ ‫‪BEGIN‬‬ ‫;)‪DBMS_OUTPUT.PUT_LINE('Hello, ' || name‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫‪.3‬الحزم ‪:‬الحزم تجمع بين اإلجراءات والوظائف المتشابهة في وحدة واحدة‪ ،‬مما يسهل إدارة األكواد الكبيرة والمعقدة‪.‬‬ ‫‪CREATE OR REPLACE PACKAGE my_package IS‬‬ ‫;)‪PROCEDURE greet(name IN VARCHAR2‬‬ ‫;‪END my_package‬‬ ‫‪/‬‬ ‫في‪ ، PL/SQL‬هناك شروط يجب أن تلتزم بها عند تسمية المتغيرات‪.‬إليك بعض الشروط األساسية لتسمية المتغيرات في‬ ‫‪PL/SQL:‬‬ ‫شروط تسمية المتغيرات في ‪: PL/SQL‬‬ ‫يجب أن تبدأ أسماء المتغيرات بحرف‪.‬‬ ‫‪.1‬‬ ‫يمكن أن تتكون أسماء المتغيرات من حروف (كبيرة وصغيرة) وأرقام وشرطة سفلية (_) فقط‪.‬‬ ‫‪.2‬‬ ‫يجب أن ال تحتوي أسماء المتغيرات على أي رموز خاصة مثل @ وغيرها‪.‬‬ ‫‪.3‬‬ ‫يجب أن تكون أسماء المتغيرات فريدة داخل نطاق البرنامج‪.‬‬ ‫‪.4‬‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫أنواع البيانات في ‪PL/SQL‬‬ ‫تقدم ‪ PL/SQL‬مجموعة واسعة من أنواع البيانات لتخزين قيم مختلفة‪.‬إليك شرح مختصر ألهم هذه األنواع‪:‬‬ ‫رقمي ‪(Numeric):‬‬ ‫ ‬ ‫‪ : NUMBER‬يستخدم لتخزين األعداد الصحيحة والعشرية‪.‬يمكن تحديد الدقة والتسوية‪.‬‬ ‫ ‬ ‫‪ : INTEGER‬يستخدم لتخزين األعداد الصحيحة فقط‪.‬‬ ‫ ‬ ‫‪ : BINARY_INTEGER‬يستخدم لتخزين األعداد الصحيحة الثنائية‪.‬‬ ‫ ‬ ‫نصي ‪(Character):‬‬ ‫ ‬ ‫‪ : VARCHAR2‬يستخدم لتخزين سلسلة أحرف ذات طول محدد‪.‬‬ ‫ ‬ ‫‪ : CHAR‬يستخدم لتخزين سلسلة أحرف ذات طول ثابت‪.‬‬ ‫ ‬ ‫‪ : CLOB‬يستخدم لتخزين نصوص كبيرة الحجم‪.‬‬ ‫ ‬ ‫تاريخ ووقت ‪(Date and Time):‬‬ ‫ ‬ ‫‪ : DATE‬يستخدم لتخزين التاريخ والوقت‪.‬‬ ‫ ‬ ‫منطقي ‪Boolean :‬‬ ‫ ‬ ‫‪ : BOOLEAN‬يستخدم لتخزين قيم منطقية (صحيح أو خطأ)‪.‬‬ ‫ ‬ ‫كائنات كبيرة ‪LARGE OBJECT (LOB) :‬‬ ‫ ‬ ‫‪ : BLOB‬يستخدم لتخزين بيانات ثنائية كبيرة الحجم (مثل الصور والصوت)‪.‬‬ ‫ ‬ ‫‪ : BFILE‬هذا النوع يستخدم لتخزين مسار ملف موجود خارج قاعدة البيانات‪.‬ال يخزن الملف نفسه داخل قاعدة‬ ‫ ‬ ‫البيانات‪ ،‬بل يشير إلى مكانه على نظام الملفات‪.‬‬ ‫أخرى ‪others :‬‬ ‫ ‬ ‫ ‪ : %TYPE‬يمكن تعريف أنواع بيانات مخصصة باستخدام النوع ‪.‬‬ ‫ ‪ : %ROWTYPE‬يمكن استخدام النوع لتخزين سجل كامل من جدول ‪.‬‬ ‫ ‪ : REF CURSOR‬يمكن استخدام هذا النوع لتخزين نتيجة استعالم ‪.SQL‬‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫جدول يوضح بعض أنواع البيانات‬ Data Type Maximum Size in PL/SQL Maximum Size in SQL CHAR 32,767 bytes 2,000 bytes NCHAR 32,767 bytes 2,000 bytes RAW 32,767 bytes 2,000 bytes VARCHAR2 32,767 bytes 4,000 bytes NVARCHAR2 32,767 bytes 4,000 bytes LONG 32,760 bytes 2 gigabytes (GB) - 1 LONG RAW 32,760 bytes 2 GB BLOB 128 terabytes (TB) (4 GB - 1) * database_block_size CLOB 128 TB (4 GB - 1) * database_block_size NCLOB 128 TB (4 GB - 1) * database_block_size ‫مثال‬ DECLARE v_short_text VARCHAR2 )50( ; -- ‫ حرفًا‬50 ‫متغير نصي بطول‬ v_long_text VARCHAR2 )32767( ; -- ‫ حرفًا‬32767 ‫متغير نصي بطول‬ v_fixed_text CHAR )10(; -- ‫ أحرف‬10 ‫متغير نصي ثابت الطول بطول‬ v_large_text CLOB; --‫متغير نصي كبير‬ BEGIN -- ‫استخدام المتغيرات في الكود‬ v_short_text := 'Hello, World'; v_fixed_text := 'FixedLen' ; v_large_text := 'This is a large text stored in CLOB type' ; DBMS_OUTPUT.PUT_LINE(v_short_text); DBMS_OUTPUT.PUT_LINE(v_fixed_text); DBMS_OUTPUT.PUT_LINE(SUBSTR(v_large_text, 1, 20)) ; -- ‫ حرفًا فقط‬20 ‫عرض أول‬ END; / ABOULFATEH AL-DHABEI PL/SQL ‫مالمقصود ب ‪ ROWID‬؟‬ ‫‪ ROWID‬هو معرف فريد يعطى لكل صف داخل جداول قاعدة البيانات في أوراكل‪.‬يمثل ‪ ROWID‬العنوان الفعلي للصف‬ ‫في قاعدة البيانات‪ ،‬مما يجعله أسرع وسيلة للوصول إلى الصفوف‪.‬يحتوي ‪ROWID‬على معلومات حول الموقع الفعلي للصف‬ ‫على القرص‪.‬‬ ‫‪ROWID:‬‬ ‫مميزات‬ ‫أداء عالي ‪ :‬استخدام ‪ ROWID‬في االستعالمات يمكن أن يحسن من األداء بشكل كبير‪ ،‬ألنه يعرض الصف مباشرة‬ ‫ ‬ ‫دون الحاجة إلى فحص الفهارس‪.‬‬ ‫معرف فريد ‪ :‬كل صف له ‪ ROWID‬خاص به‪ ،‬مما يعني أنه يمكنك دائ ًما تحديد الصف بشكل فريد باستخدام‬ ‫ ‬ ‫‪ROWID.‬‬ ‫‪ROWID:‬‬ ‫صيغة‬ ‫‪ROWID‬يتكون من أربعة مكونات‪:‬‬ ‫الكتالوج ‪:‬معرف الفتحة التي تحتوي على الصف‪.‬‬ ‫‪.1‬‬ ‫الملف ‪:‬معرف الملف‪.‬‬ ‫‪.2‬‬ ‫الكتلة ‪:‬معرف الكتلة التي تحتوي على الصف‪.‬‬ ‫‪.3‬‬ ‫الصف ‪:‬موقع الصف داخل الكتلة‪.‬‬ ‫‪.4‬‬ ‫مثال على كيفية استخدام ‪ ROWID‬في ‪PL/SQL‬‬ ‫استعراض `‪ `ROWID‬للصفوف في جدول معين ‪--‬‬ ‫‪SELECT ROWID, employee_name‬‬ ‫;‪FROM employees‬‬ ‫استخدام `‪ `ROWID‬لتحديد صف معين ‪--‬‬ ‫‪DECLARE‬‬ ‫;‪v_rowid ROWID‬‬ ‫‪BEGIN‬‬ ‫‪SELECT ROWID‬‬ ‫‪INTO v_rowid‬‬ ‫‪FROM emp‬‬ ‫;'‪WHERE ename = 'ABOULFATEH‬‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫لتحديث الصف المحدد `‪ `ROWID‬استخدام ‪--‬‬ ‫‪UPDATE emp‬‬ ‫‪SET sal = sal * 1.1‬‬ ‫;‪WHERE ROWID = v_rowid‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫في هذا المثال‪ ،‬يتم أوالً استرجاع ‪ ROWID‬للصفوف في جدول ‪ emp‬ثم يتم استخدام ‪ ROWID‬لتحديد صف معين‬ ‫وتحديث راتب الموظف المسمى '‪. 'ABOULFATEH‬‬ ‫استخدام ‪ ROWID‬يمكن أن يكون مفيدًا في العمليات التي تتطلب أداء عالي وتحديد الصفوف بدقة‪.‬‬ ‫ما هو ‪ ROWNUM‬في ‪ Oracle‬؟‬ ‫‪ ROWNUM‬هو رقم تسلسلي يعين بشكل مؤقت للصفوف عند استرجاعها من قاعدة بيانات ‪ Oracle‬نتيجة الستعالم ما‪.‬‬ ‫بعبارة أبسط‪ ،‬هو رقم يبدأ من ‪ 1‬ويزداد بـ ‪ 1‬لكل صف يتم استرجاعه‪.‬‬ ‫لماذا نستخدم ‪ ROWNUM‬؟‬ ‫تحديد عدد الصفوف المسترجعة ‪ :‬يمكن استخدام ‪ ROWNUM‬لتحديد عدد معين من الصفوف التي تريد استرجاعها‪.‬على‬ ‫ ‬ ‫سبيل المثال‪ ،‬السترجاع أول ‪ 10‬صفوف من جدول‪ ،‬يمكنك استخدام‪:‬‬ ‫;‪SELECT * FROM my table WHERE ROWNUM = 18 THEN‬‬ ‫('أنت بالغ');‪DBMS_OUTPUT.PUT_LINE‬‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫;‪END IF‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫‪.2‬الجملة الشرطية ‪IF...ELSE‬‬ ‫تستخدم هذه الجملة لتنفيذ مجموعة من األوامر إذا كان الشرط صحي ًحا ومجموعة أخرى إذا كان الشرط خاطئًا‪.‬‬ ‫‪ THEN‬الشرط ‪IF‬‬ ‫األوامر التي يتم تنفيذها إذا كان الشرط صحي ًحا‪--‬‬ ‫‪ELSE‬‬ ‫األوامر التي يتم تنفيذها إذا كان الشرط خاطئًا‪--‬‬ ‫;‪END IF‬‬ ‫مثال‪:‬‬ ‫‪DECLARE‬‬ ‫;'‪v_gender VARCHAR2(1):='M‬‬ ‫‪BEGIN‬‬ ‫‪IF v_gender = 'M ' THEN‬‬ ‫('ذكر');‪DBMS_OUTPUT.PUT_LINE‬‬ ‫‪ELSE‬‬ ‫('أنثى');‪DBMS_OUTPUT.PUT_LINE‬‬ ‫;‪END IF‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫‪.3‬الجملة الشرطية ‪IF...ELSIF‬‬ ‫تستخدم هذه الجملة عندما يكون هناك أكثر من شرط يجب فحصه‪.‬‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ IF 1‫ الشرط‬THEN ‫ صحي ًحا‬1‫ الشرط‬--‫األوامر التي يتم تنفيذها إذا كان‬ ELSIF 2‫ الشرط‬THEN ‫ صحي ًحا‬- 2‫األوامر التي يتم تنفيذها إذا كان الشرط‬ ELSE ‫ الشروط خاطئة‬-- ‫األوامر التي يتم تنفيذها إذا كانت جميع‬ END IF; :‫مثال‬ DECLARE v_grade NUMBER :=85; BEGIN IF v_grade 90 => THEN DBMS_OUTPUT.PUT_LINE)'‫;('امتياز‬ ELSIF v_grade 80 => THEN DBMS_OUTPUT.PUT_LINE)'‫;('جيد جدًا‬ ELSE DBMS_OUTPUT.PUT_LINE)'‫;('مقبول‬ END IF; END; / CASE ‫ الجملة الشرطية‬.4 ABOULFATEH AL-DHABEI PL/SQL ‫تستخدم هذه الجملة للتحقق من قيمة تعبير واحد مقابل قيم متعددة‪.‬‬ ‫التعبير‪CASE‬‬ ‫‪ THEN‬القيمة‪WHEN 1‬‬ ‫‪ --‬األوامر التي يتم تنفيذها إذا كانت القيمة تساوي القيمة‪1‬‬ ‫‪ THEN‬القيمة‪WHEN 2‬‬ ‫‪ --‬األوامر التي يتم تنفيذها إذا كانت القيمة تساوي القيمة‪2‬‬ ‫‪ELSE‬‬ ‫‪ --‬األوامر التي يتم تنفيذها إذا لم تتطابق القيمة مع أي من القيم السابقة‬ ‫;‪END CASE‬‬ ‫مثال‪:‬‬ ‫‪DECLARE‬‬ ‫;‪v_day NUMBER := 3‬‬ ‫‪BEGIN‬‬ ‫‪CASE v_day‬‬ ‫‪WHEN 1 THEN‬‬ ‫;('األحد')‪DBMS_OUTPUT.PUT_LINE‬‬ ‫‪WHEN 2 THEN‬‬ ‫;('االثنين')‪DBMS_OUTPUT.PUT_LINE‬‬ ‫‪... --‬‬ ‫‪ELSE‬‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫;('يوم غير صالح')‪DBMS_OUTPUT.PUT_LINE‬‬ ‫;‪END CASE‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫ملحوظات‪:‬‬ ‫يمكن استخدام مشغلي المقارنة مثل =‪ =< ,=> ,< ,> ,=! ,‬داخل الشروط‪.‬‬ ‫ ‬ ‫يمكن استخدام عمليات منطقية مثل ‪ AND, OR, NOT‬لربط شروط متعددة‪.‬‬ ‫ ‬ ‫يمكن تعشيق الجمل الشرطية إلنشاء منطق أكثر تعقيدًا‪.‬‬ ‫ ‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫جمل الدوران في ‪PL/SQL‬‬ ‫جمل الدوران في ‪ PL/SQL‬هي عبارة عن آليات تسمح بتكرار تنفيذ مجموعة من األوامر لعدد محدد من المرات أو حتى تحقق شرط‬ ‫معين‪.‬هذه الجمل أساسية إلنشاء برامج ديناميكية وقادرة على معالجة كميات كبيرة من البيانات‪.‬‬ ‫‪.1‬حلقة ‪FOR‬‬ ‫االستخدام‪ :‬تستخدم عندما نعرف مسبقًا عدد المرات التي نريد تكرار فيها مجموعة من األوامر‪.‬‬ ‫ ‬ ‫الشكل العام‪:‬‬ ‫ ‬ ‫‪ LOOP‬نهاية ‪..‬بداية ‪FOR i IN‬‬ ‫‪ --‬األوامر التي سيتم تنفيذها‬ ‫;‪END LOOP‬‬ ‫مثال‪:‬‬ ‫ ‬ ‫‪DECLARE‬‬ ‫;‪i NUMBER‬‬ ‫‪BEGIN‬‬ ‫‪FOR i IN 1..10 LOOP‬‬ ‫;)‪DBMS_OUTPUT.PUT_LINE(i‬‬ ‫;‪END LOOP‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫االستخدام‪ :‬تستخدم لتكرار عنصر في مجموعة من‬ ‫العناصر‪ ،‬مثل صفوف جدول‪.‬‬ ‫الشكل العام‪:‬‬ ‫ ‬ ‫‪FOR element IN collection LOOP‬‬ ‫‪ --‬األوامر التي سيتم تنفيذها‬ ‫;‪END LOOP‬‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ :‫مثال‬ DECLARE v_emp_record emp%ROWTYPE; BEGIN FOR v_emp_record IN (SELECT * FROM emp) LOOP DBMS_OUTPUT.PUT_LINE('‫رقم الموظف‬: ' || v_emp_record.empno || ', ‫االسم‬: ' || v_emp_record.ename || ', ‫الراتب‬: ' || v_emp_record.sal); END LOOP; END; / WHILE ‫ حلقة‬.2 ً ‫ تستخدم عندما نريد تكرار مجموعة من األوامر طالما أن شر‬:‫االستخدام‬.‫طا معي ًنا صحي ًحا‬ :‫الشكل العام‬ WHILE ‫ الشرط‬LOOP ‫ األوامر التي سيتم تنفيذها‬-- END LOOP; :‫المخطط‬ :‫مثال‬ DECLARE i NUMBER :=5; BEGIN WHILE i = 10‬‬ ‫;‪END LOOP‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫‪.5‬حلقة ‪For Loop REVERSE‬‬ ‫عبارة ‪ FOR LOOP REVERSE‬هي طريقة بسيطة وفعالة لتنفيذ حلقة ‪ FOR‬بحيث تبدأ من القيمة النهائية وتنتهي بالقيمة‬ ‫األولية‪ ،‬أي بعكس الترتيب الطبيعي للحلقة‪.‬هذا مفيد عندما نريد معالجة مجموعة من القيم بترتيب تنازلي بدالً من تصاعدي‪.‬‬ ‫تركيب الحلقة‪:‬‬ ‫‪FOR loop_counter IN REVERSE lower_bound.. upper_bound‬‬ ‫‪LOOP‬‬ ‫‪ --‬مجموعة األوامر التي سيتم تنفيذها في كل تكرار للحلقة‬ ‫;‪END LOOP‬‬ ‫‪ :loop_counter‬متغير عداد يحمل قيمة التكرار الحالي‪.‬‬ ‫ ‬ ‫‪ :lower_bound‬القيمة الصغرى (أو النهائية) التي يبدأ منها العد‪.‬‬ ‫ ‬ ‫‪ :upper_bound‬القيمة العظمى (أو األولية) التي ينتهي عندها العد‪.‬‬ ‫ ‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫مثال‪:‬‬ ‫لنفترض أننا نريد طباعة األعداد من ‪ 10‬إلى ‪ 1‬بترتيب تنازلي‪:‬‬ ‫‪DECLARE‬‬ ‫;‪i NUMBER‬‬ ‫‪BEGIN‬‬ ‫‪FOR i IN REVERSE1.. 10‬‬ ‫‪LOOP‬‬ ‫;)‪DBMS_OUTPUT.PUT_LINE(i‬‬ ‫;‪END LOOP‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫الشرح‪:‬‬ ‫اإلعالن عن المتغير‪ :‬يتم إعالن المتغير ‪ i‬من نوع ‪ NUMBER‬ليكون عداد الحلقة‪.‬‬ ‫‪.1‬‬ ‫بدء الحلقة‪ :‬تبدأ الحلقة من القيمة ‪( 10‬النهائية) وتنتهي بالقيمة ‪( 1‬األولية)‪ ،‬بحيث يتناقص قيمة ‪ i‬في كل تكرار‪.‬‬ ‫‪.2‬‬ ‫جسم الحلقة‪ :‬داخل الحلقة‪ ،‬يتم طباعة قيمة ‪ i‬الحالية باستخدام ‪.DBMS_OUTPUT.PUT_LINE‬‬ ‫‪.3‬‬ ‫نهاية الحلقة‪ :‬عند الوصول إلى نهاية الحلقة‪ ،‬يتم تكرار الخطوات من ‪ 2‬إلى ‪ 3‬حتى تصبح قيمة ‪ i‬أقل من ‪.1‬‬ ‫‪.4‬‬ ‫مخرجات هذا المثال‪:‬‬ ‫‪10‬‬ ‫‪9‬‬ ‫‪8‬‬ ‫‪7‬‬ ‫‪6‬‬ ‫‪5‬‬ ‫‪4‬‬ ‫‪3‬‬ ‫‪2‬‬ ‫‪1‬‬ ‫استخدامات أخرى‪:‬‬ ‫معالجة مصفوفات أو سجالت بترتيب عكسي‪ :‬يمكن استخدام ‪ FOR LOOP REVERSE‬لمعالجة عناصر مصفوفة أو سجالت‬ ‫ ‬ ‫جدول بترتيب عكسي‪.‬‬ ‫تنفيذ عمليات حسابية بترتيب معين‪ :‬يمكن استخدامها لتنفيذ عمليات حسابية تبدأ من قيمة نهائية وتنتهي بقيمة أولية‪.‬‬ ‫ ‬ ‫إنشاء تقارير بترتيب تنازلي‪ :‬يمكن استخدامها إلنشاء تقارير تعرض البيانات بترتيب تنازلي حسب حقل معين‪.‬‬ ‫ ‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫الوحدات البرمجية في أوراكل‬ ‫الوحدات البرمجية في ‪ :PL/SQL‬المسماة وغير المسماة‬ ‫مقدمة‬ ‫في لغة ‪ ،PL/SQL‬الوحدات البرمجية هي اللبنات األساسية لبناء التطبيقات‪.‬هذه الوحدات تُستخدم لتنظيم الكود وتقسيمه إلى أجزاء‬ ‫أصغر قابلة إلعادة االستخدام‪.‬يمكن تصنيف هذه الوحدات إلى نوعين رئيسيين‪:‬‬ ‫‪.1‬الوحدات البرمجية غير المسماة (‪:)Anonymous Blocks‬‬ ‫‪ o‬تعريف‪ :‬هي كتل من الكود ال تحمل اس ًما محددًا وتُنفذ بشكل مباشر عند كتابتها‪.‬‬ ‫‪ o‬البنية‪:‬‬ ‫‪SQL‬‬ ‫‪DECLARE‬‬ ‫إعالنات المتغيرات والثوابت ‪--‬‬ ‫‪BEGIN‬‬ ‫التعليمات البرمجية التي يتم تنفيذها ‪--‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫االستخدامات‪:‬‬ ‫‪o‬‬ ‫اختبارات سريعة‪ :‬الختبار قطع صغيرة من الكود بسرعة‪.‬‬ ‫▪‬ ‫مهام بسيطة‪ :‬لتنفيذ مهام بسيطة ال تتطلب إنشاء إجراءات أو دوال معقدة‪.‬‬ ‫▪‬ ‫تنفيذ واحد‪ :‬يتم تنفيذ الكود مرة واحدة فقط عند تشغيل الوحدة‪.‬‬ ‫▪‬ ‫مثال‪:‬‬ ‫‪o‬‬ ‫‪DECLARE‬‬ ‫;'علي' =‪v_employee_name VARCHAR2(30) :‬‬ ‫‪BEGIN‬‬ ‫;)‪: ' || v_employee_name‬اسم الموظف هو'(‪DBMS_OUTPUT.PUT_LINE‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫الوحدات البرمجية المسماة‪:‬‬ ‫‪.2‬‬ ‫تعريف‪ :‬هي كتل من الكود تحمل اس ًما محددًا ويمكن استدعاؤها من أي مكان في البرنامج‪.‬‬ ‫‪o‬‬ ‫أنواعها‪:‬‬ ‫‪o‬‬ ‫اإلجراءات (‪ :)Procedures‬ال ترجع قيمة‪.‬‬ ‫▪‬ ‫الدوال (‪ :)Functions‬ترجع قيمة واحدة‪.‬‬ ‫▪‬ ‫الحزم (‪ :)Packages‬مجموعة من اإلجراءات والدوال واألنواع والمتغيرات ذات الصلة‪.‬‬ ‫▪‬ ‫البنية‪:‬‬ ‫‪o‬‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫‪CREATE OR REPLACE PROCEDURE procedure_name‬‬ ‫‪IS‬‬ ‫إعالنات المتغيرات المحلية ‪--‬‬ ‫‪BEGIN‬‬ ‫التعليمات البرمجية ‪--‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫االستخدامات‪:‬‬ ‫‪o‬‬ ‫إعادة االستخدام‪ :‬يمكن استدعاء الوحدة المسماة من أي مكان في البرنامج‪.‬‬ ‫▪‬ ‫التنظيم‪ :‬تساعد في تنظيم الكود وتقسيمه إلى وحدات وظيفية‪.‬‬ ‫▪‬ ‫المعايير‪ :‬يمكن تمرير معلمات إلى الوحدة المسماة‪.‬‬ ‫▪‬ ‫االستثناءات‪ :‬يمكن التعامل مع األخطاء واالستثناءات داخل الوحدة‪.‬‬ ‫▪‬ ‫مثال‪:‬‬ ‫‪o‬‬ ‫‪CREATE OR REPLACE PROCEDURE get_employee_name‬‬ ‫‪(p_employee_id IN NUMBER,‬‬ ‫)‪p_employee_name OUT VARCHAR2‬‬ ‫‪IS‬‬ ‫‪BEGIN‬‬ ‫‪SELECT first_name INTO p_employee_name‬‬ ‫‪FROM employees‬‬ ‫;‪WHERE employee_id = p_employee_id‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫متى تستخدم كل نوع؟‬ ‫الوحدات غير المسماة‪:‬‬ ‫ ‬ ‫الختبارات سريعة وبسيطة‪.‬‬ ‫‪o‬‬ ‫لمهام ال تتكرر‪.‬‬ ‫‪o‬‬ ‫عندما ال تحتاج إلى إعادة استخدام الكود‪.‬‬ ‫‪o‬‬ ‫الوحدات المسماة‪:‬‬ ‫ ‬ ‫إلعادة استخدام الكود‪.‬‬ ‫‪o‬‬ ‫لتنظيم الكود الكبير‪.‬‬ ‫‪o‬‬ ‫إلنشاء واجهات برمجية (‪.)APIs‬‬ ‫‪o‬‬ ‫للتعامل مع األخطاء واالستثناءات‪.‬‬ ‫‪o‬‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫االختالفات الرئيسية‬ ‫الوحدات المسماة‬ ‫الوحدات غير المسماة‬ ‫الميزة‬ ‫يحمل اس ًما محددًا‬ ‫ال يوجد اسم محدد‬ ‫االسم‬ ‫يمكن إعادة استخدامها من أي مكان‬ ‫إعادة االستخدام ال يمكن إعادة استخدامها مباشرة‬ ‫تدعم المعلمات‬ ‫ال تدعم المعلمات‬ ‫المعلمات‬ ‫يمكن التعامل معها بشكل منظم‬ ‫يمكن التعامل معها لكن ليس بشكل منظم‬ ‫االستثناءات‬ ‫أكثر تنظي ًما‬ ‫أقل تنظي ًما‬ ‫التنظيم‬ ‫الخالصة‬ ‫كل من الوحدات البرمجية المسماة وغير المسماة لها دورها في تطوير تطبيقات ‪.PL/SQL‬اختيار النوع المناسب يعتمد على متطلبات‬ ‫التطبيق وحجم الكود‪.‬بشكل عام‪ ،‬يجب استخدام الوحدات المسماة لتنظيم الكود وإعادة استخدامه‪ ،‬بينما يمكن استخدام الوحدات غير‬ ‫المسماة الختبارات سريعة ومهام بسيطة‪.‬‬ ‫مالحظات‪:‬‬ ‫يمكن دمج الوحدات غير المسماة داخل الوحدات المسماة‪.‬‬ ‫ ‬ ‫الحزم هي طريقة قوية لتنظيم الوحدات البرمجية وتوفير مستوى أعلى من التجريد‪.‬‬ ‫ ‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫الوحدات البرمجية المسماه‬ ‫‪.1‬الحزم (‪:)Packages‬‬ ‫تعريف‪ :‬هي مجموعة من اإلجراءات‪ ،‬الدوال‪ ،‬المتغيرات‪ ،‬األنواع‪ ،‬واالستثناءات التي يتم تجميعها في وحدة واحدة‪.‬‬ ‫ ‬ ‫الغرض‪ :‬توفر إعادة االستخدام‪ ،‬التنظيم‪ ،‬و التغليف (‪.)Encapsulation‬‬ ‫ ‬ ‫مثال‪ :‬حزمة لحساب العمليات الحسابية األساسية‬ ‫ ‬ ‫‪.2‬اإلجراءات (‪:)Procedures‬‬ ‫تعريف‪ :‬مجموعة من األوامر التي تقوم بتنفيذ مهمة معينة‪.‬‬ ‫ ‬ ‫الغرض‪ :‬ال تقوم بإرجاع قيمة‪ ،‬ولكنها تستخدم لتنفيذ مجموعة من العمليات‪.‬‬ ‫ ‬ ‫مثال‪ :‬إجراء إلدراج صف جديد في جدول‪.‬‬ ‫ ‬ ‫‪.3‬الدوال (‪:)Functions‬‬ ‫تعريف‪ :‬تشبه اإلجراءات ولكنها تقوم بإرجاع قيمة من نوع معين‪.‬‬ ‫ ‬ ‫الغرض‪ :‬تستخدم في الحسابات والتعبير عن قيم‪.‬‬ ‫ ‬ ‫مثال‪ :‬دالة لحساب الجذر التربيعي لعدد‪.‬‬ ‫ ‬ ‫‪.4‬األنواع (‪:)Types‬‬ ‫تعريف‪ :‬تسمح بإنشاء أنواع بيانات مخصصة‪.‬‬ ‫ ‬ ‫الغرض‪ :‬تستخدم لتمثيل هياكل بيانات معقدة‪.‬‬ ‫ ‬ ‫مثال‪ :‬نوع لتمثيل موظف يحتوي على اسم‪ ،‬رقم‪ ،‬وراتب‪.‬‬ ‫ ‬ ‫‪.5‬المؤشرات (‪:)Cursors‬‬ ‫تعريف‪ :‬تسمح بالوصول إلى البيانات في جدول بشكل صف بصف‪.‬‬ ‫ ‬ ‫الغرض‪ :‬تستخدم للتحكم في تنفيذ األوامر ‪.SQL‬‬ ‫ ‬ ‫مثال‪ :‬مؤشر لعرض جميع الموظفين في قسم معين‪.‬‬ ‫ ‬ ‫‪.6‬االستثناءات (‪:)Exceptions‬‬ ‫تعريف‪ :‬تستخدم للتعامل مع األخطاء غير المتوقعة التي قد تحدث أثناء تنفيذ الكود‪.‬‬ ‫ ‬ ‫الغرض‪ :‬تضمن استمرارية عمل التطبيق عند حدوث أخطاء‪.‬‬ ‫ ‬ ‫مثال‪ :‬استثناء لمعالجة حالة عدم وجود صف‪.‬‬ ‫ ‬ ‫‪.7‬القادحات (‪:)Triggers‬‬ ‫تعريف‪ :‬هي إجراءات أو دوال يتم تنفيذها تلقائيًا استجابة لحدث معين في قاعدة البيانات‪.‬‬ ‫ ‬ ‫الغرض‪ :‬تستخدم لتنفيذ عمليات تلقائية عند حدوث تغييرات في البيانات‪.‬‬ ‫ ‬ ‫مثال‪ :‬زاجر لزيادة الرصيد في جدول حساب بنكي عند إجراء إيداع‪.‬‬ ‫ ‬ ‫لماذا تستخدم الوحدات البرمجية في أوراكل؟‬ ‫إعادة االستخدام‪ :‬يمكن استخدام الوحدات البرمجية في أماكن متعددة في قاعدة البيانات‪.‬‬ ‫ ‬ ‫التنظيم‪ :‬تساعد في تنظيم الكود وجعله أكثر قابلية للقراءة والصيانة‪.‬‬ ‫ ‬ ‫األمان‪ :‬يمكن التحكم في الوصول إلى الوحدات البرمجية‪.‬‬ ‫ ‬ ‫الكفاءة‪ :‬يمكن تحسين أداء التطبيقات باستخدام الوحدات البرمجية‪.‬‬ ‫ ‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫الدوال (‪)Functions‬‬ ‫الدوال (‪ )Functions‬في لغة ‪ PL/SQL‬هي عبارة عن وحدات برمجية مصممة ألداء مهمة محددة وإرجاع قيمة واحدة من نوع‬ ‫بيانات معين‪.‬تُستخدم الدوال لتنفيذ عمليات حسابية‪ ،‬منطقية‪ ،‬أو استرجاع قيم من قاعدة البيانات‪ ،‬مما يساهم في تحسين قابلية قراءة‬ ‫الكود وإعادة استخدامه‪.‬‬ ‫بنية الدالة األساسية‬ ‫تتكون الدالة بشكل عام من األجزاء التالية‪:‬‬ ‫كلمة المفتاح ‪ :FUNCTION‬تحدد بداية تعريف الدالة‪.‬‬ ‫‪.1‬‬ ‫اسم الدالة‪ :‬هو االسم الذي يتم استخدامه الستدعاء الدالة‪.‬‬ ‫‪.2‬‬ ‫قائمة المعلمات‪ :‬تحدد القيم التي يتم تمريرها إلى الدالة عند استدعائها‪.‬‬ ‫‪.3‬‬ ‫نوع البيانات المرجعة‪ :‬يحدد نوع البيانات التي ستقوم الدالة بإرجاعها‪.‬‬ ‫‪.4‬‬ ‫الجزء التنفيدي‪ :‬يحتوي على األوامر التي تقوم بتنفيذ منطق الدالة‪.‬‬ ‫‪.5‬‬ ‫عبارة ‪ :RETURN‬تستخدم إلرجاع القيمة النهائية للدالة‪.‬‬ ‫‪.6‬‬ ‫الصيغة العامة‪:‬‬ ‫‪CREATE OR REPLACE FUNCTION function_name (parameter1 IN data_type,‬‬ ‫)‪parameter2 IN data_type,...‬‬ ‫‪RETURN return_data_type‬‬ ‫‪IS‬‬ ‫إعالنات المتغيرات المحلية ‪--‬‬ ‫‪BEGIN‬‬ ‫التعليمات البرمجية ‪--‬‬ ‫;‪RETURN result‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫مثال‪:‬‬ ‫‪CREATE OR REPLACE FUNCTION get_employee_age‬‬ ‫)‪) p_birth_date IN employees.birth_date%TYPE‬‬ ‫‪RETURN NUMBER IS‬‬ ‫;‪v_age NUMBER‬‬ ‫‪BEGIN‬‬ ‫‪ --‬حساب العمر باستخدام وظائف تاريخ‬ ‫‪v_age;... =:‬‬ ‫;‪RETURN v_age‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫مزايا استخدام الدوال‬ ‫إعادة االستخدام‪ :‬يمكن استدعاء الدالة من أي مكان في الكود‪ ،‬مما يقلل من تكرار الكود‪.‬‬ ‫ ‬ ‫قابلية القراءة‪ :‬تجعل الكود أكثر وضو ًحا وسهولة في الصيانة‪.‬‬ ‫ ‬ ‫التنظيم‪ :‬تساعد في تنظيم الكود وتقسيمه إلى وحدات وظيفية أصغر‪.‬‬ ‫ ‬ ‫الكفاءة‪ :‬يمكن تحسين أداء التطبيقات عن طريق استخدام الدوال‪.‬‬ ‫ ‬ ‫أنواع الدوال‬ ‫الدوال البسيطة‪ :‬تقوم بتنفيذ عمليات حسابية بسيطة وإرجاع قيمة واحدة‪.‬‬ ‫ ‬ ‫الدوال المعقدة‪ :‬يمكن أن تحتوي على منطق تحكم‪ ،‬استدعاءات لدوال أخرى‪ ،‬ومعالجة استثناءات‪.‬‬ ‫ ‬ ‫الدوال المحددة مسبقًا‪ :‬هي دوال يتم توفيرها بواسطة أوراكل‪ ،‬ويمكن تصنيف الدوال المحددة مسبقًا في أوراكل إلى عدة فئات‪:‬‬ ‫ ‬ ‫دوال التحويل‪ :‬تستخدم لتحويل البيانات من نوع إلى آخر‪.‬‬ ‫ ‬ ‫مثال‪TO_NUMBER ,TO_DATE ,TO_CHAR :‬‬ ‫‪o‬‬ ‫الدوال الحسابية‪ :‬تستخدم إلجراء عمليات حسابية‪.‬‬ ‫ ‬ ‫‪ o‬مثال‪TRUNC ,ROUND ,SQRT :‬‬ ‫الدوال النصية‪ :‬تستخدم لمعالجة النصوص‪.‬‬ ‫ ‬ ‫‪ o‬مثال‪SUBSTR ,LOWER ,UPPER :‬‬ ‫الدوال التاريخية‪ :‬تستخدم للعمل مع التواريخ واألزمنة‪.‬‬ ‫ ‬ ‫‪ o‬مثال‪LAST_DAY ,ADD_MONTHS :‬‬ ‫دوال مجموعة‪ :‬تستخدم إلجراء عمليات على مجموعات من البيانات‪.‬‬ ‫ ‬ ‫‪ o‬مثال‪AVG ,SUM ,COUNT :‬‬ ‫دوال أخرى‪ :‬تغطي مجاالت متنوعة مثل التحقق من وجود القيم‪ ،‬المقارنات‪ ،‬وغيرها‪.‬‬ ‫ ‬ ‫‪ o‬مثال‪CASE ,DECODE ,NVL :‬‬ ‫الدوال المخصصة‪ :‬هي دوال يتم تعريفها من قبل المستخدم‪.‬‬ ‫ ‬ ‫استخدامات الدوال‬ ‫الحسابات‪ :‬إجراء عمليات حسابية مثل الجمع‪ ،‬الطرح‪ ،‬الضرب‪ ،‬القسمة‪ ،‬الجذور‪ ،‬وغيرها‪.‬‬ ‫ ‬ ‫التحويل‪ :‬تحويل البيانات من نوع إلى آخر‪ ،‬مثل تحويل التاريخ إلى نص أو العكس‪.‬‬ ‫ ‬ ‫االستعالم عن البيانات‪ :‬استرجاع قيم من قاعدة البيانات بنا ًء على شروط معينة‪.‬‬ ‫ ‬ ‫التحقق من صحة البيانات‪ :‬التأكد من صحة البيانات المدخلة‪.‬‬ ‫ ‬ ‫العمليات المنطقية‪ :‬اتخاذ قرارات بنا ًء على شروط معينة‪.‬‬ ‫ ‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫أمثلة على الدوال‬ ‫دالة لحساب مساحة المستطيل‪:‬‬ ‫ ‬ ‫‪CREATE OR REPLACE FUNCTION calculate_area‬‬ ‫‪)p_length IN NUMBER,‬‬ ‫(‪p_width IN NUMBER‬‬ ‫‪RETURN NUMBER‬‬ ‫‪IS‬‬ ‫‪BEGIN‬‬ ‫;‪RETURN p_length * p_width‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫دالة للتحقق من رقم هاتف‪:‬‬ ‫ ‬ ‫‪CREATE OR REPLACE FUNCTION is_valid_phone_number‬‬ ‫(‪(p_phone_number IN VARCHAR2‬‬ ‫‪RETURN BOOLEAN‬‬ ‫‪IS‬‬ ‫‪BEGIN‬‬ ‫‪... --‬منطق التحقق من صحة رقم الهاتف‬ ‫;‪END‬‬ ‫‪/‬‬ ‫الختام‬ ‫الدوال هي أداة قوية في ‪ PL/SQL‬تساعد في بناء تطبيقات قواعد البيانات بشكل أكثر كفاءة ومرونة‪.‬من خالل فهم مفهوم الدوال‬ ‫واستخدامها بشكل صحيح‪ ،‬يمكنك كتابة كود أكثر قابلية للقراءة والصيانة وإعادة االستخدام‪.‬‬ ‫مالحظات هامة‪:‬‬ ‫يمكن للدالة أن تستدعي دوال أخرى‪.‬‬ ‫ ‬ ‫يمكن تعريف الدوال داخل الحزم (‪ )Packages‬لتنظيم الكود بشكل أفضل‪.‬‬ ‫ ‬ ‫يمكن استخدام الدوال في عبارات ‪ ،SQL‬مثل عبارات ‪ WHERE‬و ‪.HAVING‬‬ ‫ ‬ ‫مالحظات إضافية‪:‬‬ ‫المعلمات‪ :‬يمكن أن تكون المعلمات إدخال (‪ )IN‬أو إخراج (‪ )OUT‬أو إدخال وإخراج (‪.)IN OUT‬‬ ‫ ‬ ‫االستثناءات‪ :‬يمكن التعامل مع االستثناءات داخل الدوال باستخدام الكلمات المفتاحية ‪ EXCEPTION‬و ‪.WHEN‬‬ ‫ ‬ ‫الدوال المتداخلة‪ :‬يمكن تعريف دوال داخل دوال أخرى‪.‬‬ ‫ ‬ ‫الدوال الزائدة التحميل‪ :‬يمكن تعريف أكثر من دالة بنفس االسم ولكن بمعلمات مختلفة‪.‬‬ ‫ ‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ :‫ للتحقق من وجود موظف في جدول معين بنا ًء على رقم الموظف‬PL/SQL ‫ أنشىء دالة بلغة‬: ‫مثال‬ CREATE OR REPLACE FUNCTION is_employee_exists (p_employee_id IN employees.employee_id%TYPE( RETURN BOOLEAN IS v_count NUMBER; BEGIN SELECT COUNT )*(INTO v_count FROM employees WHERE employee_id = p_employee_id; IF v_count > 0 THEN RETURN TRUE; ELSE RETURN FALSE; END IF; END; / :‫كيفية استدعاء الدالة‬ DECLARE v_employee_exists BOOLEAN; BEGIN -- ‫ هو رقم موظف‬7788 ‫ افترض أن‬-- v_employee_exists := is_employee_exists )7788( ; IF v_employee_exists THEN DBMS_OUTPUT.PUT_LINE )'‫; ('الموظف موجود‬ ELSE DBMS_OUTPUT.PUT_LINE)'‫; ('الموظف غير موجود‬ END IF; END; / ABOULFATEH AL-DHABEI PL/SQL ‫ دالة لحساب مجموع رقمين‬.1 CREATE OR REPLACE FUNCTION add_numbers (num1 IN NUMBER, num2 IN NUMBER) RETURN NUMBER IS result NUMBER; BEGIN result := num1 + num2; RETURN result; END; / -- ‫استدعاء الدالة‬ DECLARE sum_result NUMBER; BEGIN sum_result := add_numbers(10, 20); DBMS_OUTPUT.PUT_LINE('‫مجموع الرقمين هو‬: ' || sum_result); END; / ‫ دالة للتحقق من عدد زوجي أو فردي‬.2 CREATE OR REPLACE FUNCTION is_even (num IN NUMBER) RETURN VARCHAR2 IS BEGIN IF MOD(num, 2) = 0 THEN RETURN '‫;'زوجي‬ ELSE RETURN '‫;'فردي‬ END IF; END; / -- ‫استدعاء الدالة‬ DECLARE number_type VARCHAR2(10); BEGIN number_type := is_even(5); DBMS_OUTPUT.PUT_LINE('‫ هو‬5 ‫العدد‬: ' || number_type); END; / ABOULFATEH AL-DHABEI PL/SQL ‫ دالة إليجاد أكبر عدد من ثالثة أعداد‬.3 CREATE OR REPLACE FUNCTION find_max (num1 IN NUMBER, num2 IN NUMBER, num3 IN NUMBER) RETURN NUMBER IS BEGIN IF num1 >= num2 AND num1 >= num3 THEN RETURN num1; ELSIF num2 >= num1 AND num2 >= num3 THEN RETURN num2; ELSE RETURN num3; END IF; END; / -- ‫استدعاء الدالة‬ DECLARE max_number NUMBER; BEGIN max_number := find_max(15, 25, 10); DBMS_OUTPUT.PUT_LINE('‫أكبر عدد هو‬: ' || max_number); END; / ‫ دالة لتحويل الحروف إلى أحرف كبيرة‬.4 CREATE OR REPLACE FUNCTION upper_case (str IN VARCHAR2) RETURN VARCHAR2 IS BEGIN RETURN UPPER(str); END; / -- ‫استدعاء الدالة‬ DECLARE upper_string VARCHAR2(30); BEGIN upper_string := upper_case('ahmed'); DBMS_OUTPUT.PUT_LINE('‫الحروف الكبيرة‬: ' || upper_string); END; / ABOULFATEH AL-DHABEI PL/SQL ‫ دالة لحساب طول سلسلة نصية‬.5 CREATE OR REPLACE FUNCTION string_length (str IN VARCHAR2) RETURN NUMBER IS BEGIN RETURN LENGTH(str); END; / -- ‫استدعاء الدالة‬ DECLARE str_length NUMBER; BEGIN str_length := string_length('hello world'); DBMS_OUTPUT.PUT_LINE('‫طول السلسلة‬: ' || str_length); END; / ‫ دالة إلرجاع اسم الموظف بنا ًء على رقم الموظف‬.6 CREATE OR REPLACE FUNCTION get_employee_name (p_empno IN employees.empno%TYPE) RETURN employees.ename%TYPE IS v_ename employees.ename%TYPE; BEGIN SELECT ename INTO v_ename FROM employees WHERE empno = p_empno; RETURN v_ename; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('‫;)'ال يوجد موظف بهذا الرقم‬ RETURN NULL; END; / -- ‫استدعاء الدالة‬ DECLARE v_name VARCHAR2(20); BEGIN v_name := get_employee_name(7369); DBMS_OUTPUT.PUT_LINE('‫اسم الموظف هو‬: ' || v_name); END; / ABOULFATEH AL-DHABEI PL/SQL ‫ دالة لحساب متوسط رواتب الموظفين في قسم معين‬.7 CREATE OR REPLACE FUNCTION get_avg_salary (p_deptno IN employees.deptno%TYPE) RETURN NUMBER IS v_avg_sal NUMBER; BEGIN SELECT AVG(sal) INTO v_avg_sal FROM employees WHERE deptno = p_deptno; RETURN v_avg_sal; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('‫;)'ال يوجد موظفين في هذا القسم‬ RETURN NULL; END; / -- ‫استدعاء الدالة‬ DECLARE v_avg_sal NUMBER; BEGIN v_avg_sal := get_avg_salary(20); DBMS_OUTPUT.PUT_LINE('‫ هو‬20 ‫متوسط الراتب في القسم‬: ' || v_avg_sal); END; / ‫ دالة لزيادة رواتب جميع الموظفين بنسبة مئوية معينة‬.8 CREATE OR REPLACE PROCEDURE increase_salaries (p_percent IN NUMBER) IS BEGIN UPDATE employees SET sal = sal * (1 + p_percent/100); END; / -- )‫ هذه دالة إجرائية ال ترجع قيمة‬:‫استدعاء اإلجراء (مالحظة‬ BEGIN increase_salaries(10); -- 10 ‫زيادة الرواتب بنسبة‬% END; / ABOULFATEH AL-DHABEI PL/SQL ‫ دالة إليجاد عدد الموظفين في كل قسم‬.9 CREATE OR REPLACE FUNCTION get_dept_count (p_deptno IN employees.deptno%TYPE) RETURN NUMBER IS v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM employees WHERE deptno = p_deptno; RETURN v_count; END; / -- ‫استدعاء الدالة‬ DECLARE v_count NUMBER; BEGIN v_count := get_dept_count(30); DBMS_OUTPUT.PUT_LINE('‫ هو‬30 ‫عدد الموظفين في القسم‬: ' || v_count); END; / ‫ دالة إلرجاع اسم الوظيفة بنا ًء على رقم الوظيفة‬.10 CREATE OR REPLACE FUNCTION get_job_title (p_job_id IN employees.job_id%TYPE) RETURN jobs.job_title%TYPE IS v_job_title jobs.job_title%TYPE; BEGIN SELECT job_title INTO v_job_title FROM jobs WHERE job_id = p_job_id; RETURN v_job_title; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('‫;)'ال يوجد وظيفة بهذا الرقم‬ RETURN NULL; END; / -- ‫استدعاء الدالة‬ DECLARE v_job_title VARCHAR2(30); BEGIN v_job_title := get_job_title('SA_REP'); DBMS_OUTPUT.PUT_LINE('‫اسم الوظيفة هو‬: ' || v_job_title); END; / ABOULFATEH AL-DHABEI PL/SQL ‫اإلجراءات البرمجية (‪)Procedures‬‬ ‫ما هي اإلجراءات البرمجية في ‪PL/SQL‬؟‬ ‫اإلجراء (‪ )Procedure‬في ‪ PL/SQL‬هو عبارة عن كتلة من التعليمات البرمجية التي يتم تنفيذها عند استدعائها‪.‬تستخدم اإلجراءات‬ ‫ألتمتة المهام المتكررة‪ ،‬وتنفيذ عمليات معقدة على البيانات‪ ،‬وتقسيم منطق التطبيق إلى وحدات أصغر‪.‬‬ ‫متى نستخدم اإلجراءات؟‬ ‫أتمتة المهام‪ :‬يمكن استخدام اإلجراءات ألتمتة المهام الروتينية مثل تحديث البيانات‪ ،‬وإرسال رسائل البريد اإللكتروني‪ ،‬وإنشاء‬ ‫ ‬ ‫تقارير‪.‬‬ ‫تنفيذ عمليات معقدة‪ :‬يمكن استخدام اإلجراءات لتنفيذ عمليات معقدة تتطلب عدة خطوات‪.‬‬ ‫ ‬ ‫إعادة االستخدام‪ :‬يمكن استدعاء اإلجراء مرة واحدة وتنفيذها من أماكن متعددة في الكود‪.‬‬ ‫ ‬ ‫تحسين القابلية للقراءة والصيانة‪ :‬يمكن تقسيم الكود إلى إجراءات أصغر لتسهيل فهمه وصيانته‪.‬‬ ‫ ‬ ‫هيكل اإلجراء‬ ‫يتكون اإلجراء بشكل عام من‪:‬‬ ‫الرأس (‪ :)Header‬يحدد اسم اإلجراء والمعلمات التي يأخذها‪.‬‬ ‫ ‬ ‫البدن (‪ :)Body‬يحتوي على التعليمات البرمجية التي يتم تنفيذها عند استدعاء اإلجراء‪.‬‬ ‫ ‬ ‫(‪CREATE OR REPLACE PROCEDURE my_procedure‬‬ ‫‪p_parameter1 IN NUMBER,‬‬ ‫‪p_parameter2 OUT VARCHAR2‬‬ ‫‪)IS‬‬ ‫‪ --‬تعليمات اإلجراء هنا‬ ‫‪BEGIN‬‬ ‫‪... --‬‬ ‫;‪END my_procedure‬‬ ‫معلمات االجراء‬ ‫‪ :IN‬معلمة إدخال يتم تمرير قيمتها إلى اإلجراء‪.‬‬ ‫ ‬ ‫‪ :OUT‬معلمة مخرج يتم إرجاع قيمة منها إلى ال ُمستدعي‪.‬‬ ‫ ‬ ‫‪ :IN OUT‬معلمة يمكن قراءتها وكتابتها داخل اإلجراء‪.‬‬ ‫ ‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫مثال على إجراء بسيط‬ ‫(‪CREATE OR REPLACE PROCEDURE increase_salary‬‬ ‫‪p_employee_id IN employees.employee_id%TYPE,‬‬ ‫‪p_increase_amount IN NUMBER‬‬ ‫(‬ ‫‪IS‬‬ ‫‪BEGIN‬‬ ‫‪UPDATE employees‬‬ ‫‪SET salary = salary + p_increase_amount‬‬ ‫;‪WHERE employee_id = p_employee_id‬‬ ‫;‪END increase_salary‬‬ ‫استدعاء اإلجراء‬ ‫‪BEGIN‬‬ ‫‪ --‬زيادة راتب الموظف رقم ‪ 7900‬بـ ‪--500‬‬ ‫;(‪increase_salary)500 ,7900‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫ميزات اإلجراءات‬ ‫مرونة‪ :‬يمكن تمرير مختلف أنواع البيانات كمعلمات لإلجراءات‪.‬‬ ‫ ‬ ‫إعادة االستخدام‪ :‬يمكن استدعاء اإلجراء من أي مكان في قاعدة البيانات‪.‬‬ ‫ ‬ ‫التنظيم‪ :‬تساعد اإلجراءات على تنظيم الكود وتحسين قابلية الصيانة‪.‬‬ ‫ ‬ ‫االستثناءات‪ :‬يمكن التعامل مع األخطاء باستخدام كتلة ‪.EXCEPTION‬‬ ‫ ‬ ‫أمثلة أخرى ألستخدامات اإلجراءات‬ ‫إجراء عمليات حسابية معقدة‪ :‬يمكن كتابة إجراءات لحساب القيم اإلحصائية أو المالية‪.‬‬ ‫ ‬ ‫إرسال رسائل البريد اإللكتروني‪ :‬يمكن استخدام اإلجراءات إلرسال رسائل إلكترونية تلقائية بنا ًء على أحداث معينة‪.‬‬ ‫ ‬ ‫إنشاء تقارير‪ :‬يمكن إنشاء إجراءات لتوليد تقارير مخصصة‪.‬‬ ‫ ‬ ‫تحقق من صحة البيانات‪ :‬يمكن استخدام اإلجراءات للتحقق من صحة البيانات المدخلة قبل تخزينها في قاعدة البيانات‪.‬‬ ‫ ‬ ‫مالحظات هامة‬ ‫ال ترجع قيمة‪ :‬على عكس الدوال‪ ،‬ال ترجع اإلجراءات قيمة بشكل مباشر‪.‬يتم استخدام المعلمات النمط ‪ OUT‬إلرجاع القيم‪.‬‬ ‫ ‬ ‫يمكنها تنفيذ أي عدد من العمليات‪ :‬يمكن لإلجراء تنفيذ أي عدد من العمليات‪ ،‬بما في ذلك تحديث الجداول‪ ،‬وإدراج سجالت جديدة‪،‬‬ ‫ ‬ ‫وحذف سجالت‪ ،‬واستدعاء إجراءات أخرى‪.‬‬ ‫يمكنها استدعاء دوال أخرى‪ :‬يمكن لإلجراء استدعاء دوال أخرى لتنفيذ مهام محددة‪.‬‬ ‫ ‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫ إجراء لحساب مجموع رواتب الموظفين‬.1 CREATE OR REPLACE PROCEDURE calc_total_salary IS v_total_salary NUMBER:=0; BEGIN SELECT SUM(salary) INTO v_total_salary FROM employees; DBMS_OUTPUT.PUT_LINE('= ‫ ||'مجموع الرواتب‬v_total_salary); END; / -- ‫استدعاء الدالة‬ BEGIN calc_total_salary; END; / ‫ إجراء لزيادة راتب موظف بقيمة معينة بناءا على رقمة‬.2 CREATE OR REPLACE PROCEDURE update_emp_sal ( p_emp_id IN emp.empno%TYPE, p_sal IN emp.sal%TYPE) IS BEGIN UPDATE emp SET sal = sal+ p_sal WHERE empno = p_emp_id; END; / -- ‫استدعاء الدالة‬ BEGIN update_emp_sal(7369, 100); -- 100 ‫ بمقدار‬7369 ‫يزيد راتب الموظف رقم‬ END; / ABOULFATEH AL-DHABEI PL/SQL ‫ إجراء إلدراج موظف جديد‬.3 CREATE OR REPLACE PROCEDURE insert_employee )p_empno IN emp.empno%TYPE, p_ename IN emp.ename%TYPE, p_job IN emp.job%TYPE, p_sal IN emp.sal%TYPE, p_mgr IN emp.mgr%TYPE, p_hiredate IN emp.hiredate%TYPE, p_deptno IN emp. deptno %TYPE) AS BEGIN INSERT INTO emp (empno,ename,job,sal,mgr,hiredate,deptno) VALUES (p_empno, p_ename, p_job, p_sal,p_mgr, p_hiredate, p_deptno); COMMIT; EXCEPTION WHEN DUP_VAL_ON_INDEX THEN -- ‫استثناء في حال ادخال رقم موظف موجود‬ DBMS_OUTPUT.PUT_LINE('Employee number already exists'( ; END; / --‫استدعاء الدالة‬ BEGIN insert_employee( p_empno => 8000, p_ename =>'ABOULFATEH', p_job => 'ANALYST', p_sal => 1500, p_mgr => 7902, p_hiredate => TO_DATE('2024-12-25', 'YYYY-MM-DD'), p_deptno => 20 , ); END; / ‫ إجراء لحذف موظف‬.4 CREATE OR REPLACE PROCEDURE delete_employee (p_emp_id IN emp.empno%TYPE( IS BEGIN DELETE FROM emp WHERE empno = p_emp_id; END; / ABOULFATEH AL-DHABEI PL/SQL --‫استدعاء الدالة‬ BEGIN delete_employee (7900); -- 7900 ‫حذف بيانات الموظف رقم‬ END; ‫ إجراء للتحقق من وجود موظف‬.5 CREATE OR REPLACE PROCEDURE check_employee_exists (p_empno IN emp.empno%TYPE, p_exists OUT number( IS BEGIN SELECT COUNT )*( INTO p_exists FROM employees WHERE empno = p_empno; END; / --‫استدعاء الدالة‬ DECLARE v_exists NUMBER; BEGIN check_employee_exists(7369, v_exists); -- ‫استدعاء اإلجراء‬ IF v_exists > 0 THEN DBMS_OUTPUT.PUT_LINE('‫;)'الموظف موجود‬ ELSE DBMS_OUTPUT.PUT_LINE('‫;)'الموظف غير موجود‬ END IF; END; / ‫ إجراء لزيادة رواتب جميع الموظفين بنسبة مئوية معينة‬.6 CREATE OR REPLACE PROCEDURE increase_salaries )p_percentage IN NUMBER( IS BEGIN UPDATE emp SET salary = salary + 1 * (p_percentage/100); END; / --‫استدعاء الدالة‬ BEGIN increase_salaries(10); -- 10 ‫زيادة الرواتب بنسبة‬% END; / ABOULFATEH AL-DHABEI PL/SQL ‫ إجراء إليجاد أكبر راتب‬.7 CREATE OR REPLACE PROCEDURE find_max_salary IS v_max_salary NUMBER; BEGIN SELECT MAX(salary) INTO v_max_salary FROM employees; DBMS_OUTPUT.PUT_LINE(' ‫ ||'الراتب هو‬v_max_salary); END; / --‫استدعاء الدالة‬ BEGIN find_max_salary ; END; / ‫ عرض جميع الموظفين‬.8 CREATE OR REPLACE PROCEDURE show_all_employees AS BEGIN DBMS_OUTPUT.PUT_LINE('EMPNO ENAME JOB MGR HIREDATE S AL COMM DEPTNO'); FOR emp_rec IN (SELECT * FROM emp) LOOP DBMS_OUTPUT.PUT_LINE(emp_rec.empno || ' ' || emp_rec.ename || ' ' || emp_rec.job || ' ' || emp_rec.mgr || ' ' || emp_rec.hiredate || ' ' || emp_rec.sal || ' ' || emp_rec.comm || ' ' || emp_rec.deptno); END LOOP; END; / --‫استدعاء الدالة‬ BEGIN show_all_employees; END; / ABOULFATEH AL-DHABEI PL/SQL ‫ إجراء إلنشاء جدول جديد‬.9 CREATE OR REPLACE PROCEDURE create_new_table IS BEGIN EXECUTE IMMEDIATE ' CREATE TABLE new_table (id NUMBER, name VARCHAR2(50));' END; / --‫استدعاء الدالة‬ BEGIN create_new_table; END; / 30 ‫ إيجاد أعلى راتب في القسم‬.10 CREATE OR REPLACE PROCEDURE find_max_salary_dept30 (max_salary OUT NUMBER) AS BEGIN SELECT MAX(sal(INTO max_salary FROM emp WHERE deptno:=30; END; / --‫استدعاء الدالة‬ DECLARE max_salary number; BEGIN find_max_salary_dept30(max_salary); DBMS_OUTPUT.PUT_LINE(' max_salary = '|| max_salary); END; / ABOULFATEH AL-DHABEI PL/SQL ‫المؤشرات (‪)Cursors‬‬ ‫مقدمة‬ ‫في أوراكل هو عبارة عن منطقة تخزين مؤقتة في الذاكرة يتم استخدامها الحتواء نتيجة استعالم‬ ‫المؤشر )‪(Cursor‬‬ ‫‪ SQL‬الذي يعيد أكثر من صف واحد‪.‬بمعنى آخر‪ ،‬هو مؤشر يتحرك على مجموعة من الصفوف الناتجة عن استعالم معين‪ ،‬ويسمح‬ ‫لك بمعالجة هذه الصفوف صفًا صفًا بدالً من الحصول على النتيجة كاملة في وقت واحد‪.‬‬ ‫بمعنى ان المؤشر تسمح لك بالوصول إلى نتائج استعالم ‪ SQL‬بشكل صف بصف‪ ،‬بدالً من الحصول على النتيجة بأكملها دفعة واحدة‪.‬‬ ‫هذا يمنحك مزيدًا من التحكم في كيفية معالجة البيانات المسترجعة من قاعدة البيانات‪.‬‬ ‫لماذا نستخدم المؤشرات؟‬ ‫كبيرا‪ ،‬فإن المؤشرات تساعد في تجنب استهالك كمية كبيرة من الذاكرة‬ ‫معالجة نتائج كبيرة‪ :‬عندما يكون حجم البيانات المسترجعة ً‬ ‫ ‬ ‫دفعة واحدة‪.‬‬ ‫التحكم في سجالت البيانات‪ :‬يمكنك معالجة كل سجل بشكل فردي‪ ،‬واتخاذ قرارات بنا ًء على قيم السجل الحالي‪.‬‬ ‫ ‬ ‫تحديث البيانات‪ :‬يمكنك تحديث البيانات أثناء التمرير على المؤشر‪.‬‬ ‫ ‬ ‫العمليات المعقدة‪ :‬تستخدم المؤشرات لتنفيذ عمليات معقدة تتطلب معالجة متعددة المراحل للبيانات‪.‬‬ ‫ ‬ ‫بنية (دورة حياة) المؤشر األساسية‬ ‫تتكون بنية المؤشر بشكل عام من األجزاء التالية‪:‬‬ ‫‪.1‬إعالن المؤشر‪(Cursor Declaration):‬‬ ‫تعريف االسم ‪:‬يتم إعطاء المؤشر اس ًما فريدًا لتمييزه عن المؤشرات األخرى‪.‬‬ ‫ ‬ ‫ربطه باالستعالم ‪:‬يتم ربط المؤشر باستعالم ‪ SQL‬يحدد البيانات التي سيتم استرجاعها‪.‬‬ ‫ ‬ ‫تحديد األعمدة ‪:‬يتم تحديد األعمدة التي ستتم استرجاعها من االستعالم‪.‬‬ ‫ ‬ ‫‪.2‬فتح المؤشر‪(Cursor Open):‬‬ ‫يتم تنفيذ االستعالم المرتبط بالمؤشر‪.‬‬ ‫ ‬ ‫يتم تحميل النتائج في منطقة تخزين مؤقت‪.‬‬ ‫ ‬ ‫يتم وضع المؤشر قبل الصف األول من النتائج‪.‬‬ ‫ ‬ ‫‪.3‬الوصول إلى البيانات‪(Fetching):‬‬ ‫األمر ‪ FETCH:‬يستخدم لجلب الصف الحالي من المؤشر وتخزين قيمه في المتغيرات‪.‬‬ ‫ ‬ ‫الحلقة ‪ LOOP:‬تستخدم لتكرار عملية الجلب حتى الوصول إلى نهاية النتائج‪.‬‬ ‫ ‬ ‫شرط الخروج ‪:‬يستخدم الشرط ‪ %NOTFOUND‬للتحقق من الوصول إلى نهاية النتائج والخروج من الحلقة‪.‬‬ ‫ ‬ ‫‪.4‬إغالق المؤشر‪(Cursor Close):‬‬ ‫يتم إغالق المؤشر لتحرير الموارد المستخدمة‪.‬‬ ‫ ‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫أسم المؤشر‬ ‫االستعالم المرتبط‬ ‫بالمؤشر و الذي سيقوم‬ ‫بتنفيذه‬ ‫تشغغغغغغيل المؤشغغغغغر ليقوم‬ ‫بتنفيذ جملة االسغغغغغغغتعالم‬ ‫المرتبطة فيه واحضغغغغغغغار‬ ‫البيغغغغانغغغغات الى الغغغغذاكرة‬ ‫المؤقتة‬ ‫اعالق المؤشغغغغغر وتحرير‬ ‫المنطقة المؤقتة للمؤشغر‬ ‫في الذاكرة‬ ‫جلب البيانان من الذاكرة‬ ‫واسغغغنادها الى المتغيرات‬ ‫المناسبة‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ ‫‪.6‬سمات المؤشر‪(Cursor Attributes):‬‬ ‫‪ %NOTFOUND‬تُستخدم للتحقق مما إذا تم الوصول إلى نهاية مجموعة النتائج لتعيد ‪ True‬خالف ذلك تعيد ‪.False‬‬ ‫ ‬ ‫يعود ‪ TRUE‬عندما يتحقق انه مازال يوجد صف حالي في المؤشر خالف ذلك تعيد ‪. False‬‬ ‫‪%FOUND‬‬ ‫ ‬ ‫‪ %ROWCOUNT‬يعطي عدد السجالت التي تم استرجاعها حتى اآلن‪.‬‬ ‫ ‬ ‫‪ %ISOPEN‬يعود ‪ TRUE‬إذا كان المؤشر مفتو ًحا و ‪ FALSE‬إذا كان مغلقًا‪.‬‬ ‫ ‬ ‫‪.7‬استخدامات المؤشرات ‪:‬‬ ‫معالجة نتائج كبيرة ‪:‬معالجة البيانات صفًا بصف بدالً من تحميلها دفعة واحدة‪.‬‬ ‫ ‬ ‫التحكم في سجالت البيانات ‪:‬معالجة كل سجل بشكل فردي واتخاذ قرارات بنا ًء عليه‪.‬‬ ‫ ‬ ‫تحديث البيانات ‪:‬تحديث البيانات أثناء التمرير على المؤشر‪.‬‬ ‫ ‬ ‫العمليات المعقدة ‪:‬تنفيذ عمليات معقدة تتطلب معالجة متعددة المراحل للبيانات‪.‬‬ ‫ ‬ ‫‪.8‬أنواع المؤشرات في ‪PL/SQL‬‬ ‫‪.1‬المؤشرات الضمنية (‪:)Implicit Cursors‬‬ ‫تعريف‪ :‬يتم إنشاؤها تلقائيًا عند تنفيذ أي عبارة ‪ SQL‬تقوم باسترجاع مجموعة من الصفوف‪ ،‬مثل ‪،SELECT‬‬ ‫‪o‬‬ ‫‪.DELETE ،UPDATE‬‬ ‫مثال اكتب كود ‪ sql‬يقوم بزيادة رواتب الموظفين بنسبة ‪( %10‬مؤشر ضمني)‬ ‫‪o‬‬ ‫‪UPDATE employees‬‬ ‫‪SET salary = salary * 1.1‬‬ ‫;‪WHERE department_id :=20‬‬ ‫مثال اكتب كود ‪ sql‬يقوم بزيادة رواتب الموظفين بنسبة ‪( %10‬مؤشر ضمني)‬ ‫‪o‬‬ ‫‪BEGIN‬‬ ‫‪FOR emp_rec IN (SELECT * FROM emp) LOOP‬‬ ‫;)‪DBMS_OUTPUT.PUT_LINE(emp_rec.ename‬‬ ‫;‪END LOOP‬‬ ‫;‪END‬‬ ‫‪/‬‬ ‫مالحظة ال يمكن التحكم مباشرة في المؤشرات الضمنية‪ ،‬ولكن يمكن استخدام بعض الخصائص مثل ‪ROWCOUNT%‬‬ ‫‪o‬‬ ‫و ‪ FOUND%‬و ‪ NOTFOUND%‬للحصول على معلومات حولها‪.‬‬ ‫‪ABOULFATEH AL-DHABEI‬‬ ‫‪PL/SQL‬‬ :)Explicit Cursors( ‫ المؤشرات الصريحة‬.2 ‫ مما يمنحك تحك ًما أكبر‬،CURSOR ‫ يتم تعريفها بشكل صريح في الكود من قبل المبرمج باستخدام الكلمة المفتاحي

Use Quizgecko on...
Browser
Browser