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

graphics/05fig03.gif

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.  
graphics/trick_icon.gif

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.  
graphics/trick_icon.gif

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.




Oracle PL[s]SQL by Example
Oracle PL[s]SQL by Example
ISBN: 3642256902
EAN: N/A
Year: 2003
Pages: 289

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net