بيان الحالة في Oracle بل/SQL مع أمثلة

⚡ ملخص ذكي

تختار عبارة CASE في لغة PL/SQL بديلاً واحداً من بين عدة بدائل بناءً على مُحدِّد، على غرار عبارة IF-THEN-ELSIF ولكن بشكل أوضح. تُطابق عبارة CASE البسيطة قيمة المُحدِّد، بينما تُقيِّم عبارة CASE المُبحثة شرطاً في كل جملة WHEN وتُنفِّذ أول شرط صحيح.

  • 🔀 الغرض: تختار CASE كتلة إجراء واحدة من بين العديد من الكتل، باستخدام محدد بدلاً من سلسلة منطقية.
  • 🎯 المحدد: يتم تقييم تعبير CASE مرة واحدة ومقارنته بكل قيمة WHEN.
  • 🔎 تم البحث في القضية: يضع شرطًا كاملاً في كل جملة WHEN وينفذ أول جملة صحيحة.
  • 🧮 أي نوع: يمكن أن يكون المحدد متغيرًا أو رقمًا أو تعبيرًا حسابيًا.
  • 🛟 آخر: يتم تشغيل كتلة ELSE الاختيارية عندما لا يوجد بديل مطابق.
  • 🔚 الحالة النهائية: يُنهي الأمر الإلزامي عبارة END CASE.
  • 🗄️ متوافق مع لغة SQL: على عكس عبارة IF، يمكن استخدام عبارة CASE مباشرة داخل عبارات SQL.

بيان الحالة في Oracle PL / SQL

ما هي عبارة CASE؟

عبارة CASE تشبه عبارة IF-THEN-ELSIF؛ فهي تختار بديلاً واحداً بناءً على شرط من الخيارات المتاحة.

  • تستخدم عبارة CASE "محددًا" بدلاً من تعبير منطقي لاختيار التسلسل.
  • تُعامل قيمة التعبير في عبارة CASE كمحدد.
  • يمكن أن يكون التعبير من أي نوع (حسابي، متغيرات، إلخ).
  • يتم تعيين قيمة محددة مسبقًا (محدد) لكل بديل، ويتم تنفيذ البديل الذي تتطابق قيمة المحدد الخاصة به مع قيمة التعبير الشرطي.
  • على عكس IF-THEN-ELSIF، يمكن أيضًا استخدام عبارة CASE في عبارات SQL.
  • تحتوي كتلة ELSE في عبارة CASE على التسلسل الذي سيتم تنفيذه عندما لا يتم تحديد أي من البدائل.

بناء الجملة

CASE (expression)
WHEN <value1> THEN action_block1;
WHEN <value2> THEN action_block2;
WHEN <value3> THEN action_block3;
ELSE action_block_default;
END CASE;
  • في الصيغة المذكورة أعلاه، يُرجع التعبير قيمة يمكن أن تكون من أي نوع.
  • كل عبارة "متى" هي بديل له و .
  • يتم تحديد عبارة "WHEN" التي تتطابق قيمتها مع التعبير، و يتم تنفيذه.
  • كتلة "ELSE" اختيارية وتحتوي على للتنفيذ عندما لا يوجد بديل مطابق.
  • يشير الرمز "END" إلى نهاية عبارة CASE وهو جزء إلزامي من CASE.

مثال 1: العمليات الحسابية باستخدام CASE

في هذا المثال، نقوم بإجراء عملية حسابية بين رقمين، 55 و 5.

DECLARE
a NUMBER := 55;
b NUMBER := 5;
arth_operation VARCHAR2(20) := 'MULTIPLY';
BEGIN
dbms_output.put_line('Program started.');
CASE (arth_operation)
WHEN 'ADD' THEN dbms_output.put_line('Addition of the numbers are: '|| a+b );
WHEN 'SUBTRACT' THEN dbms_output.put_line('Subtraction of the numbers are: '||a-b );
WHEN 'MULTIPLY' THEN dbms_output.put_line('Multiplication of the numbers are: '|| a*b );
WHEN 'DIVIDE' THEN dbms_output.put_line('Division of the numbers are:'|| a/b);
ELSE dbms_output.put_line('No operation action defined. Invalid operation');
END CASE;
dbms_output.put_line('Program completed.');
END;
/

Code تفسير

  • Code السطر 2: تعريف المتغير 'a' على أنه 'NUMBER' وتهيئته بالقيمة '55'.
  • Code السطر 3: تعريف المتغير 'b' على أنه 'NUMBER' وتهيئته بالقيمة '5'.
  • Code السطر 4: تعريف المتغير 'arth_operation' كـ 'VARCHAR2' بحجم 20 وتهيئته بالقيمة 'MULTIPLY'.
  • Code السطر 6: طباعة العبارة "بدأ البرنامج".
  • Code السطر 7: يتحقق CASE من قيمة التعبير. هنا، قيمة 'arth_operation' هي 'MULTIPLY'، والتي تُعامل كمحدد.
  • Code السطر 10: عبارة WHEN ذات القيمة 'MULTIPLY' تطابق المحدد، لذلك يقوم المتحكم بتحديد كتلة الإجراء هذه ويطبع "محصلة الأرقام هي: 275".
  • Code السطر 13: يمثل نهاية عبارة CASE.
  • Code السطر 14: طباعة العبارة "تم إكمال البرنامج".

Code الناتج

Program started.
Multiplication of the numbers are: 275
Program completed.

بيان الحالة التي تم البحث فيها

إن عبارة CASE التي تم البحث عنها تشبه عبارة CASE، ولكن بدلاً من استخدام محدد لاختيار البديل، فإن عبارة CASE التي تم البحث عنها تحتوي على الشرط المحدد مباشرة في عبارة WHEN.

  • يتم تنفيذ أول شرط WHEN يحقق الشرط، ويتخطى المتحكم البدائل المتبقية.

بناء الجملة

CASE
WHEN <expression1> THEN action_block1;
WHEN <expression2> THEN action_block2;
WHEN <expression3> THEN action_block3;
ELSE action_block_default;
END CASE;
  • في الصيغة المذكورة أعلاه، تحتوي كل جملة WHEN على جملة منفصلة و .
  • يتم تنفيذ عبارة WHEN التي تُرجع فيها العبارة القيمة TRUE.
  • كتلة "ELSE" اختيارية وتحتوي على للتنفيذ عندما لا يتم استيفاء أي من البدائل.
  • يشير الرمز "END" إلى نهاية عبارة CASE وهو جزء إلزامي من CASE.

مثال 1: عملية حسابية باستخدام حالة البحث

في هذا المثال، نقوم بإجراء عملية حسابية بين رقمين، 55 و 5.

DECLARE
a NUMBER := 55;
b NUMBER := 5;
arth_operation VARCHAR2(20) := 'DIVIDE';
BEGIN
dbms_output.put_line('Program started.');
CASE
WHEN arth_operation = 'ADD'
THEN dbms_output.put_line('Addition of the numbers are: '||a+b );
WHEN arth_operation = 'SUBTRACT'
THEN dbms_output.put_line('Subtraction of the numbers are: '|| a-b);
WHEN arth_operation = 'MULTIPLY'
THEN dbms_output.put_line('Multiplication of the numbers are: '|| a*b );
WHEN arth_operation = 'DIVIDE'
THEN dbms_output.put_line('Division of the numbers are: '|| a/b );
ELSE dbms_output.put_line('No operation action defined. Invalid operation');
END CASE;
dbms_output.put_line('Program completed.');
END;
/

Code تفسير

  • Code السطر 2: تعريف المتغير 'a' على أنه 'NUMBER' وتهيئته بالقيمة '55'.
  • Code السطر 3: تعريف المتغير 'b' على أنه 'NUMBER' وتهيئته بالقيمة '5'.
  • Code السطر 4: تعريف المتغير 'arth_operation' كـ 'VARCHAR2' بحجم 20 وتهيئته بالقيمة 'DIVIDE'.
  • Code السطر 6: طباعة العبارة "بدأ البرنامج".
  • Code السطر 7: تبدأ عبارة CASE التي تم البحث عنها. بنود ADD و SUBTRACتم تخطي T و MULTIPLY، لأن شروطهما لا تتطابق مع قيمة 'arth_operation'.
  • Code السطر 14: يتم استيفاء تعبير جملة WHEN "arth_operation = 'DIVIDE'" ويعيد القيمة TRUE.
  • Code السطر 15: يتم تنفيذ كتلة الإجراء الخاصة بعبارة WHEN، ويتم طباعة "قسمة الأرقام هي: 11".
  • Code السطر 17: يمثل نهاية عبارة CASE.
  • Code السطر 18: طباعة العبارة "تم إكمال البرنامج".

Code الناتج

Program started.
Division of the numbers are: 11
Program completed.

مقارنة بين الحالة والحالة التي تم البحث عنها

يختار كلا النموذجين فرعًا واحدًا، لكنهما يختلفان في كيفية اختيار الفرع، كما هو ملخص أدناه.

النوع الوصف الأستعمال
الحالات وعلى غرار إذا-ثم-إلسيف يُستخدم "المحدد" لاختيار البديل بدلاً من التعبير المنطقي. تُستخدم للاختيار من بين عدة بدائل باستخدام أداة تحديد.
حالة تم البحث فيها عبارة CASE بدون مُحدِّد فعلي. بدلاً من ذلك، تحتوي على الشرط (الذي يُقيَّم إلى صحيح أو خطأ) الذي يختار البديل. يُستخدم للاختيار من بين أكثر من بديلين، وغالبًا ما يكون ذلك ضمن شروط النطاق.

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

تقارن عبارة CASE البسيطة قيمة مُحدِّد واحد مع كل قيمة WHEN. أما عبارة CASE التي يتم البحث فيها فلا تحتوي على مُحدِّد، وتقوم بتقييم شرط كامل في كل WHEN، لذا فهي تتعامل مع النطاقات والاختبارات المركبة.

نعم. يمكن أن يظهر تعبير CASE في عبارة SELECT أو WHERE أو ORDER BY، وهو ما يمثل ميزة رئيسية مقارنة بـ IF-THEN-ELSIF، وهو تركيب يعمل فقط داخل كتل PL/SQL.

تُثير عبارة CASE استثناء CASE_NOT_FOUND إذا لم يتطابق أي فرع ولم تكن هناك عبارة ELSE. يؤدي إضافة عبارة ELSE، حتى لو كانت عبارة فارغة بقيمة NULL، إلى تجنب هذا الخطأ أثناء التشغيل.

نعم. عندما تقارن الفروع تعبيرًا واحدًا بقيم ثابتة، يمكن للذكاء الاصطناعي إعادة كتابة السلسلة كحالة CASE أكثر وضوحًا. تحقق من النتيجة، لأن حالة CASE بدون ELSE تتصرف بشكل مختلف عن حالة ELSIF المفقودة.

تُنفّذ عبارة CASE كتلة إجراءات لكل فرع وتنتهي بـ END CASE. تُرجع عبارة CASE قيمة واحدة وتنتهي بـ END، لذا يمكن إسنادها إلى متغير أو استخدامها في SQL.

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