PDF: PL/SQL Programming Guide
Document Details
Uploaded by InstrumentalLemur
Aboulfateh Al-Dhabei
Tags
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 يتم تعريفها بشكل صريح في الكود من قبل المبرمج باستخدام الكلمة المفتاحي