Oracle PL/SQL إذا كان هناك بيان آخر: ELSIF، NESTED-IF
⚡ ملخص ذكي
تتحكم عبارات اتخاذ القرار في لغة PL/SQL في أي كود يتم تشغيله بناءً على شرط منطقي. Oracle يوفر IF-THEN و IF-THEN-ELSE و IF-THEN-ELSIF و NESTED-IF، بحيث يمكن للبرنامج تخطي كتلة، أو الاختيار بين مسارين، أو تحديد بديل واحد من بين العديد من البدائل.

ما هي بيانات صنع القرار؟
تحدد بيانات اتخاذ القرار آلية التحكم في تدفق SQL تعتمد هذه العبارات على الشروط. فهي تمنح المبرمج تحكمًا أفضل في منع تنفيذ كتلة برمجية معينة، أو في اختيار الكتلة المطلوبة بناءً على شرط محدد. فيما يلي تمثيل بياني لعبارة اتخاذ القرار.

أنواع بيانات اتخاذ القرار: Oracle يوفر الأنواع التالية.
- اذا ثم
- إذا، ثم، آخر
- إذا-ثم-إلسيف
- متداخلة-إذا
- الحالات
- حالة تم البحث فيها
يتناول هذا الدرس التعليمي متغيرات دالة IF. أما نموذجا CASE و CASE المُبحث عنهما فيُغطيان في عبارة PL/SQL CASE يرشد.
بيان إذا-ثم
تُستخدم عبارة IF-THEN لتنفيذ جزء معين من التعليمات البرمجية فقط عند تحقق شرط معين. يجب أن ينتج عن هذا الشرط نتيجة منطقية قيمة (صواب/خطأ). إنها عبارة شرطية أساسية تسمح Oracle تنفيذ أو تخطي جزء من التعليمات البرمجية بناءً على الشرط المحدد مسبقًا.
صيغة عبارات IF-THEN:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_block> END IF;
- في الصيغة أعلاه، تتبع الكلمة المفتاحية 'IF' شرطًا يتم تقييمه إلى 'TRUE' أو 'FALSE'.
- ينفذ عنصر التحكم فقط إذا عادت الحالة .
- إذا كانت النتيجة هي ، يتخطى SQL ويبدأ بتنفيذ الكود بعد كتلة "END IF".
ملاحظة: عندما يتم تقييم الشرط إلى 'NULL'، فإن SQL يتعامل مع 'NULL' على أنه 'FALSE'.
مثال 1: في هذا المثال، نقوم بطباعة رسالة عندما يكون الرقم أكبر من 100.
DECLARE a NUMBER := 10; BEGIN dbms_output.put_line('Program started.'); IF( a > 100 ) THEN dbms_output.put_line('a is greater than 100'); END IF; dbms_output.put_line('Program completed.'); END; /
Code التفسير:
- Code السطر 2: تعريف المتغير 'a' كنوع بيانات 'NUMBER' وتهيئته بالقيمة '10'.
- Code السطر 4: طباعة العبارة "بدأ البرنامج".
- Code السطر 5: التحقق من الشرط، ما إذا كان المتغير 'a' أكبر من '100'.
- Code السطر 6: إذا كانت قيمة 'a' أكبر من '100'، فسيتم طباعة "a أكبر من 100". أما إذا كانت قيمة 'a' أقل من أو تساوي 100، فلن يتحقق الشرط وسيتم تجاهل عبارة الطباعة.
- Code السطر 8: طباعة العبارة "تم إكمال البرنامج".
Code الإخراج:
Program started. Program completed.
مثال 2: في هذا المثال، نقوم بطباعة رسالة إذا كان الحرف المعطى حرفًا متحركًا إنجليزيًا (A، E، I، O، U).
DECLARE a CHAR(1) := 'u'; BEGIN IF UPPER(a) in ('A','E','I','O','U' ) THEN dbms_output.put_line('The character is in English Vowels'); END IF; END; /
Code التفسير:
- Code السطر 2: تعريف المتغير 'a' على أنه 'CHAR' بحجم '1' وتهيئته بالقيمة 'u'.
- Code السطر 4: يتم التحقق مما إذا كان المتغير 'a' موجودًا في القائمة ('A'، 'E'، 'I'، 'O'، 'U'). يتم تحويل قيمة 'a' إلى أحرف كبيرة قبل المقارنة، لجعل المقارنة غير حساسة لحالة الأحرف.
- Code السطر 5: إذا كان الحرف 'a' موجودًا في القائمة، فسيتم طباعة "الحرف من حروف العلة الإنجليزية". أما إذا لم يتحقق الشرط، فلن يُخرج البرنامج أي شيء، لعدم وجود عبارة طباعة خارج كتلة IF-THEN.
Code الإخراج:
The character is in English Vowels
بيان إذا-ثم-آخر
تُستخدم عبارة IF-THEN-ELSE للاختيار بين بديلين بناءً على شرط معين. فيما يلي الصيغة.
بناء جملة عبارات IF-THEN-ELSE:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_block1> ELSE -execute if the condition failed (returns FALSE) <action_block2> END IF;
- تتبع الكلمة المفتاحية 'IF' شرطًا يتم تقييمه إلى 'TRUE' أو 'FALSE'.
- يتم تنفيذ الأمر فقط إذا عادت الحالة .
- إذا كانت النتيجة هي يتم تنفيذ SQL .
- على أي حال، يتم تنفيذ أحد جزئي الإجراء.
ملاحظة: عندما يتم تقييم الشرط إلى 'NULL'، فإن SQL يتعامل مع 'NULL' على أنه 'FALSE'.
مثال 1: في هذا المثال، نقوم بطباعة ما إذا كان الرقم المعطى فرديًا أم زوجيًا.
DECLARE a NUMBER:= 11; BEGIN dbms_output.put_line ('Program started'); IF( mod(a,2)=0) THEN dbms_output.put_line('a is even number'); ELSE dbms_output.put_line('a is odd number'); END IF; dbms_output.put_line ('Program completed.'); END; /
Code التفسير:
- Code السطر 2: تعريف المتغير 'a' كنوع بيانات 'NUMBER' وتهيئته بالقيمة '11'.
- Code السطر 4: طباعة العبارة "بدأ البرنامج".
- Code السطر 5: التحقق مما إذا كان باقي قسمة المتغير 'a' على '2' يساوي 0.
- Code السطر 6: إذا كانت القيمة '0'، فسيتم طباعة "a هو عدد زوجي".
- Code السطر 7: إذا كانت قيمة المعامل لا تساوي '0'، فإن الشرط يُرجع لذلك تتم طباعة "a هو عدد فردي".
- Code السطر 10: طباعة العبارة "تم إكمال البرنامج".
Code الإخراج:
Program started. a is odd number Program completed.
بيان IF-THEN-ELSIF
- تُستخدم عبارة IF-THEN-ELSIF عندما يجب اختيار بديل واحد من مجموعة من البدائل، حيث يكون لكل بديل شرطه الخاص.
- الشرط الأول الذي يعود يتم تنفيذ الشرط، ويتم تخطي الشروط المتبقية.
- قد تحتوي عبارة IF-THEN-ELSIF على كتلة 'ELSE'، يتم تنفيذها إذا لم يتم استيفاء أي من الشروط.
ملاحظة: كتلة ELSE اختيارية. إذا لم تكن هناك كتلة ELSE ولم يتحقق أي من الشروط، فإن وحدة التحكم تتجاوز جميع كتل الإجراءات وتنفذ التعليمات البرمجية المتبقية.
بناء جملة عبارات IF-THEN-ELSIF:
IF <condition1: returns Boolean> THEN -executed only if the condition returns TRUE <action_block1> ELSIF <condition2: returns Boolean> THEN <action_block2> ELSIF <condition3: returns Boolean> THEN <action_block3> ELSE --optional <action_block_else> END IF;
- يتم تنفيذ الأمر فقط إذا عادت الشرط 1 .
- إذا لم يتم استيفاء الشرط 1، يقوم المتحكم بالتحقق من الشرط 2، وهكذا.
- يخرج المتحكم من عبارة IF عندما يجد شرطًا يُرجع قيمة ويقوم بتشغيل كتلة الإجراء المطابق، أو عندما لا يتم استيفاء أي شرط ويتم تشغيل كتلة ELSE (إن وجدت).
ملاحظة: عندما يتم تقييم الشرط إلى 'NULL'، فإن SQL يتعامل مع 'NULL' على أنه 'FALSE'.
مثال 1: بدون كتلة ELSE. في هذا المثال، نقوم بطباعة الدرجة بناءً على العلامات المعطاة بدون شرط else (العلامة >= 70 الدرجة A، العلامة >= 40 والعلامة < 70 الدرجة B، العلامة >= 35 والعلامة < 40 الدرجة C).
DECLARE mark NUMBER := 55; BEGIN dbms_output.put_line('Program started.'); IF( mark >= 70) THEN dbms_output.put_line('Grade A'); ELSIF(mark >= 40 AND mark < 70) THEN dbms_output.put_line('Grade B'); ELSIF(mark >= 35 AND mark < 40) THEN dbms_output.put_line('Grade C'); END IF; dbms_output.put_line('Program completed.'); END; /
Code التفسير:
- Code السطر 2: تعريف المتغير 'mark' كنوع بيانات 'NUMBER' وتهيئته بالقيمة '55'.
- Code السطر 4: طباعة العبارة "بدأ البرنامج".
- Code السطر 5: التحقق من الشرط 1، ما إذا كانت "العلامة" أكبر من أو تساوي 70.
- Code السطر 7: بما أن الشرط 1 فشل، يتم التحقق من الشرط 2 '70 > العلامة >= 40'.
- Code السطر 8: الشرط 2 يعود لذلك تتم طباعة الرسالة "الدرجة ب".
- Code السطر 12: طباعة العبارة "اكتمل البرنامج". تم تخطي الشرط 3 'mark < 35'، حيث تم العثور على شرط صحيح بالفعل.
Code الإخراج:
Program started. Grade B Program completed.
المثال الثاني: باستخدام كتلة ELSE. في هذا المثال، نقوم بطباعة الدرجة بناءً على العلامات المعطاة مع شرط else (العلامة >= 70 الدرجة A، العلامة >= 40 والعلامة < 70 الدرجة B، العلامة >= 35 والعلامة < 40 الدرجة C، وإلا 'لا توجد درجة').
DECLARE mark NUMBER := 25; BEGIN dbms_output.put_line('Program started.'); IF( mark >= 70) THEN dbms_output.put_line('Grade A'); ELSIF(mark >= 40 AND mark < 70) THEN dbms_output.put_line('Grade B'); ELSIF(mark >= 35 AND mark < 40) THEN dbms_output.put_line('Grade C'); ELSE dbms_output.put_line('No Grade'); END IF; dbms_output.put_line('Program completed.'); END; /
Code التفسير:
- Code السطر 2: تعريف المتغير 'mark' كنوع بيانات 'NUMBER' وتهيئته بالقيمة '25'.
- Code السطر 4: طباعة العبارة "بدأ البرنامج".
- Code السطر 5: التحقق من الشرط 1، ما إذا كانت "العلامة" أكبر من أو تساوي 70.
- Code السطر 7: بما أن الشرط 1 فشل، يتم التحقق من الشرط 2 '70 > العلامة >= 40'.
- Code السطر 9: بما أن الشرط 2 فشل، يتم التحقق من الشرط 3 '40 > العلامة >= 35'.
- Code السطر 11: بما أن جميع الشروط فشلت، فإن فحص التحكم لكتلة ELSE يطبع "لا يوجد تقدير".
- Code السطر 14: طباعة العبارة "تم إكمال البرنامج".
Code الإخراج:
Program started. No Grade Program completed.
بيان NESTED-IF
- تسمح عبارة NESTED-IF للمبرمجين بوضع شرط واحد أو أكثر من شروط "IF" داخل شرط "IF" آخر .
- يجب أن يحتوي كل شرط "IF" على عبارة "END IF" منفصلة، والتي تحدد نهاية نطاق ذلك الشرط المحدد. .
- تعتبر عبارة "IF" أقرب عبارة "END IF" بمثابة نقطة النهاية لهذا الشرط.
- يظهر أدناه التمثيل التصويري لـ NESTED-IF.
IF <condition1: returns Boolean> THEN --executed only if the condition returns TRUE <action block1 starts> IF <condition2: returns Boolean> THEN <action_block2> END IF; --END IF corresponds to condition2 <action_block1 ends> END IF; --END IF corresponds to condition1
شرح بناء الجملة:
- تحتوي عبارة IF الخارجية على عبارة IF أخرى في كتلة الإجراء الخاصة بها.
- إذا تحقق الشرط 1 ، تنفيذ التحكم ويتحقق من الشرط 2.
- إذا كانت الشرط 2 تعود أيضًا ، ثم ويتم تنفيذه أيضاً.
- إذا كانت نتيجة الشرط الثاني هي يتخطى SQL .
مثال على عبارة IF المتداخلة: أكبر ثلاثة أعداد. في هذا المثال، نطبع أكبر ثلاثة أعداد باستخدام عبارة شرطية متداخلة. يتم تحديد الأعداد في جزء التصريح (Number = 10، 15، و20)، ويتم استرجاع القيمة القصوى باستخدام عبارات شرطية متداخلة.
DECLARE a NUMBER := 10; b NUMBER := 15; c NUMBER := 20; BEGIN dbms_output.put_line('Program started.'); IF( a > b)THEN /*Nested-if 1 */ dbms_output.put_line('Checking Nested-IF 1'); IF( a > c ) THEN dbms_output.put_line('A is greatest'); ELSE dbms_output.put_line('C is greatest'); END IF; ELSE /*Nested-if2 */ dbms_output.put_line('Checking Nested-IF 2'); IF( b > c ) THEN dbms_output.put_line('B is greatest'); ELSE dbms_output.put_line('C is greatest'); END IF; END IF; dbms_output.put_line('Program completed.'); END; /
Code التفسير:
- Code الأسطر 2-4: تعريف المتغيرات 'a' و 'b' و 'c' على أنها 'NUMBER' وتهيئتها بالقيم 10 و 15 و 20.
- Code السطر 6: طباعة العبارة "بدأ البرنامج".
- Code السطر 7: التحقق من الشرط 1، ما إذا كانت قيمة 'a' أكبر من قيمة 'b'.
- Code السطر 10: إذا كانت 'a' أكبر من 'b'، فإن الشرط المتداخل 1 يتحقق مما إذا كانت 'a' أكبر من 'c'.
- Code الأسطر 11-13: إذا كانت قيمة 'a' لا تزال أكبر، فسيتم طباعة 'A هي الأكبر'؛ وإلا فسيتم طباعة 'C هي الأكبر'.
- Code السطر 18: إذا كانت نتيجة الشرط 1 خاطئة، فإن الشرط المتداخل 2 يتحقق مما إذا كانت قيمة 'b' أكبر من قيمة 'c'.
- Code السطر 19-21: إذا كانت قيمة 'b' أكبر من قيمة 'c'، فسيتم طباعة 'B هي الأكبر'؛ وإلا فسيتم طباعة 'C هي الأكبر'.
- Code السطر 24: طباعة العبارة "تم إكمال البرنامج".
إخراج الكود:
Program started. Checking Nested-IF 2 C is greatest Program completed.
مقارنة بيانات اتخاذ القرار
يلخص الجدول أدناه مختلف العبارات الشرطية التي تمت مناقشتها، بحيث يمكن اختيار العبارة الصحيحة لحالة معينة.
| النوع | الوصف | الأستعمال |
|---|---|---|
| اذا ثم | يتحقق من شرط منطقي؛ إذا كان صحيحًا، يتم تنفيذ الكود الموجود في كتلة "THEN". | لتجاوز أو تنفيذ كتلة معينة بناءً على الشرط. |
| إذا، ثم، آخر | يتحقق من شرط منطقي؛ إذا كان صحيحًا، يتم تشغيل كتلة "THEN"، وإذا كان خاطئًا، يتم تشغيل كتلة "ELSE". | الأنسب في حالة الاختيار بين هذا أو ذاك. |
| إذا-ثم-إلسيف | يتم فحص الشروط بالتسلسل. يتم تنفيذ أول كتلة تُرجع القيمة TRUE. إذا لم تكن أي منها TRUE، يتم تنفيذ كتلة 'ELSE'. | يُستخدم للاختيار من بين أكثر من بديلين. |
| متداخلة-إذا | يسمح بوجود عبارة واحدة أو أكثر من عبارات IF-THEN أو IF-THEN-ELSIF داخل عبارة أخرى. | يُستخدم بشكل أساسي في حالات الشروط المتداخلة. |


