CH7 - WordPress.com

Download Report

Transcript CH7 - WordPress.com

‫جمل التحكم‬
‫مقدمة‬
‫‪ ‬عادة تنفيذ الجمل داخل وحدة (‪ )Block‬يكون بنفس الترتيب‬
‫التي كتبت فيها هذه الجمل‪ ,‬لكن في بعض األحيان نحتاج‬
‫تغيير سير هذا التنفيذ أو تكرار جمل معينة ‪ ,‬لحل هذه‬
‫المشكلة نستخدم‪:‬‬
‫جمل التحكم مثل ‪:‬جمل الشرط و جمل الدوران‬
‫جمل الشرط‬
‫‪ ‬هناك ‪ 3‬أنواع من جمل الشرط‪:‬‬
‫‪ .1‬جملة الشرط البسيطة ‪: IF Statment‬‬
‫تتكون من جملة الشرط تليها مجموعة الجمل الواجب تنفيذها في حال تحقق الشرط‪.‬‬
‫‪ ‬مثال‪:‬‬
‫‪DECLARE‬‬
‫; ‪v_sal NUMBER‬‬
‫‪BEGIN‬‬
‫عند كتابة جملة‬
‫‪….‬‬
‫الشرط البد من‬
‫‪IF v_ename = ‘Ali’ THEN‬‬
‫وضع فاصلة‬
‫;‪v_sal := 3500‬‬
‫منقوطة بعد‬
‫انتهائها‬
‫;‪END IF‬‬
‫‪….‬‬
‫;‪END‬‬
‫جمل الشرط‬
‫‪ .2‬جملة الشرط ‪: IF THEN ELSE‬‬
‫تتكون من مجموعتين من الجمل المجموعة األولى وهي الواجب تنفيذها في حال تحقق‬
‫الشرط والمجموعة الثانية وهي المجموعة الواجب تنفيذها في حال عدم تحقق‬
‫الشرط‪.‬‬
‫‪ ‬مثال‪:‬‬
‫‪IF v_deptno = 10 THEN‬‬
‫‪UPDATE emp‬‬
‫‪SET sal = sal * 1.10‬‬
‫;‪WHERE deptno = v_deptno‬‬
‫‪ELSE‬‬
‫‪UPDATE emp‬‬
‫‪SET sal = sal * 1.08‬‬
‫;‪WHERE deptno = v_deptno‬‬
‫;‪END IF‬‬
‫جمل الشرط‬
‫جمل الشرط‬
‫‪ .3‬جملة الشرط ‪: IF THEN ELSIF‬‬
‫تتكون من مجموعتين من الجمل األولى وهي المجموعة الواجب تنفيذها‬
‫في حال تحقق الشرط والمجموعة األخرى هي مجموعة ل (‪ )IF‬الخاصة‬
‫ب(‪ )ELS‬وأيضا ممكن أن تكون مقسمة إلى جزأين مجموعة متحققة عند‬
‫حصول الشرط واألخرى أيضا بدورها ممكن أن تكون مقسمة إلى‬
‫جزأين بناء على الشرط الجديد الثاني (‪ )IF‬التابع ل(‪ )ELS‬الثانية وهكذا‬
‫إلى أن نصل إلى مرحلة تكون هناك (‪ )ELSE‬ليس لها (‪.)IF‬‬
‫جمل الشرط‬
:‫ مثال‬
IF v_grade >100 OR v_grade < 0 THEN
DBMS_OUTPUT.PUT_LINE(‘Invalid Grade ’);
ELSIF v_grade >= 90 THEN
DBMS_OUTPUT.PUT_LINE(‘A’);
ELSIF v_grade >= 80 THEN
DBMS_OUTPUT.PUT_LINE(‘B’);
ELSIF v_grade >= 70 THEN
DBMS_OUTPUT.PUT_LINE(‘C’);
ELSIF v_grade >= 60 THEN
DBMS_OUTPUT.PUT_LINE(‘D’);
ELSE
DBMS_OUTPUT.PUT_LINE(‘F’);
END IF;
‫جمل الشرط‬
‫ أي تعبير حسابي يحتوي على ‪ NULL‬فإن النتيجة تكون ‪. NULL‬‬‫ أي جملة يتم ربطها ب ‪ NULL‬فإن ‪ NULL‬تعامل في هذه الحالة على‬‫أنها فارغة‪.‬‬
‫‪ ‬عند استخدام جمل الشرط يمكن ربط أكثر من شرط باستخدام‪:‬‬
‫‪AND ,OR , NOT‬‬
‫‪ ‬مثال‪:‬‬
‫‪IF v_sal > 3000 AND v_job = ‘SALESMAN’ OR v_deptno = 10 THEN‬‬
‫‪…..‬‬
‫; ‪END IF‬‬
‫جداول المنطق‬
.‫ نستخدم جداول المنطق لمعرفة نتيجة شرط مركب من أكثر من جزء‬
AND
TRUE
FALSE
NULL
TRUE
TRUE
FALSE
NULL
FALSE
FALSE
FALSE
FALSE
NULL
NULL
FALSE
NULL
OR
TRUE
FALSE
NULL
TRUE
TRUE
TRUR
TRUE
FALSE
TRUE
FALSE
NULL
NULL
TRUE
NULL
NULL
NOT
TRUE
FALSE
FALSE
TRUE
NULL
TRUE
‫جداول المنطق‬
:‫ مثال لتطبيق جداول المنطق في جمل الشرط‬
DECLARE
v_flag BOOLEAN DEFAULT TRUE;
v_orderflag BOOLEAN ;
BEGIN
IF v_flag OR v_orderflag THEN
v_flag := FALSE;
v_orderflag := TRUE;
END IF;
IF v_flag AND v_orderflag THEN
v_flag := TRUE;
ELSIF v_flag = v_orderflag THEN
v_flag := NULL;
ELSE
v_orderflag := FALSE;
END IF ;
END;
)BOOLEAN ( ‫إذا أنشئ متغير من نوع‬
‫ولم تسند له أي قيمة فإن القيمة االبتدائية‬
NULL ‫له ستكون‬
‫حلقات الدوران‬
‫‪ ‬حلقات الدوران في تعني إمكانية تكرار جملة أومجموعة من الجمل‬
‫أثناء تنفيذ البرنامج‪.‬‬
‫‪ ‬أشكال حلقات الدوران‪:‬‬
‫‪ .1‬حلقات الدوران البسيطة ‪.Basic Loop‬‬
‫‪ .2‬حلقة الدوران ‪.FOR Loop‬‬
‫‪ .3‬حلقة الدوران ‪.WHILE Loop‬‬
‫‪ .4‬حلقات الدوران المتداخلة ‪.Nested LOOPS‬‬
‫حلقة الدوران البسيطة ‪Basic Loop‬‬
‫بداية الدوران‬
‫‪LOOP ‬‬
‫‪Statement ‬‬
‫جسم الدوران‬
‫‪...‬‬
‫جملة الخروج من جسم الدوران عند ‪EXIT [WHENcondition]; ‬‬
‫تحقق الشرط ويمكن أن تكون الجملة‬
‫في أي مكان في جسم الدوران‬
‫جملة نهاية الدوران‬
‫‪END LOOP; ‬‬
Basic Loop ‫حلقة الدوران البسيطة‬
:‫ مثال‬
DECLARE
v_ordid item.ordid%TYPE := 601;
v_counter NUMBER(2) := 1;
BEGIN
LOOP
INSERT INTO item(ordid, itemid)
VALUES(v_ordid, v_counter);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 10;
END LOOP;
END;
‫حلقة الدوران ‪FOR Loop‬‬
‫بداية ‪FOR <counter> IN [REVERSE]<lower bound>..<upper bound> LOOP ‬‬
‫الدوران‬
‫جسم الدوران‬
‫‪<sequence of statements> ‬‬
‫نهاية الدوران‬
‫‪END LOOP; ‬‬
‫نستخدم حلقة الدوران‪ FOR Loop‬في الحاالت التي يكون فيها عدد مرات التكرار‬
‫معروف قبل التنفيذ مثل ‪ 10‬مرات ‪5,‬مرات ‪...‬إلخ‬
FOR Loop ‫حلقة الدوران‬
:‫ مثال‬
BEGIN
FOR i IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('i= '||i);
END LOOP;
END;
:‫) باألعلى بالشكل التالي‬Block( ‫أو يمكن كتابة نفس وحدة‬DECLARE
v_lower number:=1;
v_upper number:=5;
BEGIN
FOR i IN v_lower.. v_upper LOOP
DBMS_OUTPUT.PUT_LINE('i= '||i);
END LOOP;
END;
‫الناتج الذي سيظهر على‬
:‫الشاشة‬
i= 1
i= 2
i= 3
i= 4
i= 5
FOR Loop ‫حلقة الدوران‬
“ REVERSE” ‫) مع‬FOR Loop( ‫ لو أردنا استخدام حلقة الدوران‬
:‫ مثال‬BEGIN
FOR i IN REVERSE 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('i= '||i);
END LOOP;
END;
‫الناتج الذي سيظهر على‬
:‫الشاشة‬
i= 5
i= 4
i= 3
i= 2
i= 1
‫حلقة الدوران ‪WHILE Loop‬‬
‫‪ ‬نستخدم في الحاالت التي يكون فيها عدد مرات التكرار غير معروف‬
‫قبل التنفيذ ‪ ,‬فهي تشبه حلقة الدوران البسيطة ولكن بعكس الشرط‪.‬‬
‫بداية الدوران‬
‫جسم الدوران‬
‫نهاية الدوران‬
‫‪WHILE (condition) ‬‬
‫‪statement; ‬‬
‫‪...‬‬
‫‪END LOOP; ‬‬
WHILE Loop ‫حلقة الدوران‬
:‫ مثال‬
DECLARE
v_Counter BINARY_INTEGER := 1;
BEGIN
WHILE (v_Counter <= 50) LOOP
INSERT INTO employee (id)
VALUES (v_Counter);
v_Counter := v_Counter + 1;
END LOOP;
END;
‫حلقات الدوران المتداخلة ‪Nested LOOPS‬‬
‫‪ ‬هي عبارة عن حلقات دوران داخل بعضها البعض كل منها يمثل‬
‫مستوى ويمكن أن تكون كل حلقة تمثل نوع مختلف من حلقات الدوران‪.‬‬
‫‪ ‬لتمييز هذه المستويات عن بعضها البعض إذ البد من استخدام عنوان‬
‫للحلقة (‪.)label‬‬
‫‪ ‬عند الخروج من حلقة الدوران ال بد من ذكر عنوان الحلقة (‪ )label‬ألن‬
‫جملة الخروج تؤدي إلى الخروج من الدوران الداخلي واالنتقال إلى‬
‫المستوى األكبر منه لبدء دورة جديدة‪.‬‬
‫مثال على حلقات الدوران المتداخلة‬
Nested LOOPS
DECLARE
v_s NUMBER := 0;
v_i NUMBER := 0;
v_j NUMBER ;
BEGIN
<<outer_loop>>
LOOP
v_i := v_i + 1;
v_j := 0;
<<inner_loop>>
LOOP
v_j := v_j + 1;
v_s := v_s + v_i * v_j; -- sum a bunch of products
EXIT inner_loop WHEN (v_j > 5);
EXIT outer_loop WHEN ((v_i * v_j) > 15);
END LOOP inner_loop;
END LOOP outer_loop;
DBMS_OUTPUT.PUT_LINE('The sum of products equals: ' || TO_CHAR(s));
END;
‫الخالصة‬
‫‪ ‬جمل التحكم‪:‬‬
‫‪ .1‬جمل الشرط‪.‬‬
‫ جملة الشرط البسيطة ‪IF Statment‬‬‫ جملة الشرط ‪IF THEN ELSE‬‬‫ جملة الشرط ‪IF THEN ELSIF‬‬‫‪ .2‬حلقات الدوران‪.‬‬
‫‪ ‬حلقات الدوران البسيطة ‪.Basic Loop‬‬
‫‪ ‬حلقة الدوران ‪.FOR Loop‬‬
‫‪ ‬حلقة الدوران ‪.WHILE Loop‬‬
‫‪ ‬حلقات الدوران المتداخلة ‪.Nested LOOPS‬‬
‫‪‬‬
‫جداول المنطق‪.‬‬