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
جداول المنطق.