Oracle PL/SQL إذا كان هناك بيان آخر: ELSIF، NESTED-IF

⚡ ملخص ذكي

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

  • 🔀 الغرض: يحدد الشرط الذي يُرجع قيمة صحيحة أو خاطئة مسار التنفيذ.
  • إذا-ثم: يتم تشغيل الكتلة فقط عندما يكون الشرط صحيحًا، وإلا يتم تخطيها.
  • ↔️ إذا-ثم-وإلا: يختار بين كتلتين، واحدة للصواب والأخرى للخطأ.
  • 🪜 إذا-ثم-وإلا إذا: يختبر الشروط بالتسلسل وينفذ الشرط الأول الذي يكون صحيحًا، مع شرط ELSE اختياري.
  • 🧩 الشرط المتداخل: يضع شرطًا شرطيًا داخل شرط شرطي آخر لتحقيق شروط مشتركة.
  • ⚠️ قاعدة NULL: يتم التعامل مع الشرط الذي يتم تقييمه إلى NULL على أنه FALSE.
  • 🔚 المنهي: يجب إغلاق كل شرط IF بشرط END IF مطابق.

Oracle PL/SQL IF THEN ELSE ELSIF

ما هي بيانات صنع القرار؟

تحدد بيانات اتخاذ القرار آلية التحكم في تدفق 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 المتداخلة

بنية عبارة 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 داخل عبارة أخرى. يُستخدم بشكل أساسي في حالات الشروط المتداخلة.

الأسئلة الشائعة

يختبر شرط ELSIF سلسلةً مسطحةً من الشروط المتنافية. أما شرط IF المتداخل فيضع شرطًا داخل شرط آخر، لذا لا يُجرى الاختبار الداخلي إلا بعد أن يكون الشرط الخارجي صحيحًا بالفعل.

تُعامل الحالة التي تُقيّم إلى NULL على أنها FALSE، لذا يتم تخطي كتلة THEN الخاصة بها. وهذا مهم عندما تكون القيمة المُقارنة قد تكون NULL، لأن الفرع لن يعمل كما يتوقع المبتدئ.

تكون عبارة CASE أكثر وضوحًا عند مقارنة تعبير واحد بالعديد من القيم الثابتة. أما عبارة IF-THEN-ELSIF فهي مناسبة لشروط النطاقات غير المترابطة. يمكن لكلتا العبارتين التعبير عن نفس المنطق، لكن CASE أسهل قراءةً عند مطابقة القيم.

نعم. يمكن للذكاء الاصطناعي تبسيط عبارات IF المتداخلة إلى سلسلة ELSIF أو CASE، واكتشاف الشروط التي لا يمكن الوصول إليها. اختبر إعادة الكتابة، لأن إعادة ترتيب الشروط قد تُغير الفرع الذي يتم تنفيذه.

تُشير عبارة END IF إلى نهاية كتلة الشرط، وهو أمرٌ ضروري عند استخدام عبارات IF المتداخلة. فبدونها، لا يستطيع المُصرّف تحديد العبارات التي تنتمي إلى الشرط، وبالتالي يُصدر خطأً.

تلخيص هذه التدوينة بـ: