Wednesday, November 4, 2009

Lab 5.2 ELSIF Statements



[ Team LiB ]





Lab 5.2 ELSIF Statements



Lab Objectives



After this Lab, you will be able to:


Use the ELSIF Statement



An ELSIF statement has the following structure:





IF CONDITION 1 THEN
STATEMENT 1;
ELSIF CONDITION 2 THEN
STATEMENT 2;
ELSIF CONDITION 3 THEN
STATEMENT 3;
...
ELSE
STATEMENT N;
END IF;

The reserved word IF marks the beginning of an ELSIF construct. The words CONDITION 1 through CONDITION N are a sequence of the conditions that evaluate to TRUE or FALSE. These conditions are mutually exclusive. In other words, if CONDITION 1 evaluates to TRUE, STATEMENT 1 is executed, and control is passed to the first executable statement after the reserved phrase END IF. The rest of the ELSIF construct is ignored. When CONDITION 1 evaluates to FALSE, control is passed to the ELSIF part and CONDITION 2 is evaluated, and so forth. If none of the specified conditions yield TRUE, control is passed to the ELSE part of the ELSIF construct. An ELSIF statement can contain any number of ELSIF clauses. This flow of the logic is illustrated in Figure 5.3.


Figure 5.3. ESLIF Statement


Figure 5.3 shows that if condition 1 evaluates to TRUE, statement 1 is executed, and control is passed to the first statement after END IF. If condition 1 evaluates to FALSE, control is passed to condition 2. If condition 2 yields TRUE, statement 2 is executed. Otherwise, control is passed to the statement following END IF, and so forth. Consider the following example.


FOR EXAMPLE





DECLARE
v_num NUMBER := &sv_num;
BEGIN
IF v_num < 0 THEN
DBMS_OUTPUT.PUT_LINE (v_num||' is a negative number');
ELSIF v_num = 0 THEN
DBMS_OUTPUT.PUT_LINE (v_num||' is equal to zero');
ELSE
DBMS_OUTPUT.PUT_LINE (v_num||' is a positive number');
END IF;
END;

The value of v_num is provided at runtime and evaluated with the help of the ELSIF statement. If the value of v_num is less that zero, the first DBMS_OUTPUT.PUT_LINE statement executes, and the ELSIF construct terminates. If the value of v_num is greater than zero, both conditions





v_num < 0 and v_num = 0

evaluate to FALSE, and the ELSE part of the ELSIF construct executes.


Assume that the value of v_num equals 5 at runtime. This example produces the following output:





Enter value for sv_num: 5
old 2: v_num NUMBER := &sv_num;
new 2: v_num NUMBER := 5;
5 is a positive number

PL/SQL procedure successfully completed.

Remember the following information about an ELSIF statement:

  • Always match IF with an END IF.

  • There must be a space between END and IF. When the space is omitted, the compiler produces the following error:




    ERROR at line 22:
    ORA-06550: line 22, column 4:
    PLS-00103: Encountered the symbol ";" when expecting one of the following: if

As you can see, this error message is not very clear, and it can take you some time to correct it, especially if you have not encountered it before.

  • There is no second "E" in "ELSIF".

  • Conditions of an ELSIF statement must be mutually exclusive. These conditions are evaluated in sequential order, from the first to the last. Once a condition evaluates to TRUE, the remaining conditions of the ELSIF statement are not evaluated at all. Consider this example of an ELSIF construct:




    IF v_num >= 0 THEN
    DBMS_OUTPUT.PUT_LINE ('v_num is greater than 0');
    ELSIF v_num =< 10 THEN
    DBMS_OUTPUT.PUT_LINE ('v_num is less than 10');
    ELSE
    DBMS_OUTPUT.PUT_LINE
    ('v_num is less than ? or greater than ?');
    END IF;

Assume that the value of v_num is equal to 5. Both conditions of the ELSIF statement can evaluate to TRUE because 5 is greater than 0, and 5 is less than 10. However, once the first condition, v_num >= 0, evaluates to TRUE, the rest of the ELSIF construct is ignored.

For any value of v_num that is greater than or equal to 0 and less than or equal to 10, these conditions are not mutually exclusive. Therefore, the DBMS_OUTPUT.PUT_LINE statement associated with the ELSIF clause will not execute for any such value of v_num. In order for the second condition, v_num <= 10, to yield TRUE, the value of v_num must be less than 0.

How would you rewrite this ELSIF construct to capture any value of v_num between 0 and 10 and display it on the screen with a single condition?



When using an ELSIF construct, it is not necessary to specify what action should be taken if none of the conditions evaluate to TRUE. In other words, an ELSE clause is not required in the ELSIF construct. Consider the following example:


FOR EXAMPLE





DECLARE
v_num NUMBER := &sv_num;
BEGIN
IF v_num < 0 THEN
DBMS_OUTPUT.PUT_LINE (v_num||' is a negative number');
ELSIF v_num > 0 THEN
DBMS_OUTPUT.PUT_LINE (v_num||' is a positive number');
END IF;
DBMS_OUTPUT.PUT_LINE ('Done...');
END;

As you can see, there is no action specified when v_num is equal to zero. If the value of v_num is equal to zero, both conditions will evaluate to FALSE, and the ELSIF statement will not execute at all. When a value of zero is specified for v_num, this example produces the following output.





Enter value for sv_num: 0
old 2: v_num NUMBER := &sv_num;
new 2: v_num NUMBER := 0;
Done…

PL/SQL procedure successfully completed.

You probably noticed that for all IF statement examples, the reserved words IF, ELSIF, ELSE, and END IF are entered on a separate line and aligned with the word IF. In addition, all executable statements in the IF construct are indented. The format of the IF construct makes no difference to the compiler. However, the meaning of the formatted IF construct becomes obvious to us.

The IF-THEN-ELSE statement




IF x = y THEN v_text := 'YES'; ELSE v_text := 'NO'; END IF;

is equivalent to




IF x = y THEN
v_text := 'YES';
ELSE
v_text := 'NO';
END IF;

The formatted version of the IF construct is easier to read and understand.






    [ Team LiB ]



    No comments: