IF Statement 
  Loop…End Loop
  Exit command
  While Loop
  For loop
  Goto statement
IF statement
IF statement is used to check the condition and
execute statements depending upon the result of the condition. 
The following is the syntax of IF statement.
IF condition-1 THEN
     
statements_set_1;
[ELSIF condition-2 THEN
      
statements_set_2;] ...
[ELSE
      
statements_set_3; ]
END IF;
Condition is
formed using relational operators listed in table 1. 
| 
   
Operator 
 | 
  
   
Meaning 
 | 
 
| 
   
>  
 | 
  
   
Greater than 
 | 
 
| 
   
>= 
 | 
  
   
Greater than or equal to  
 | 
 
| 
   
<  
 | 
  
   
Less than 
 | 
 
| 
   
<= 
 | 
  
   
Less than or equal to  
 | 
 
| 
   
= 
 | 
  
   
Equal to 
 | 
 
  <>, !=, ~=, ^=  | 
  
   
Not equal to 
 | 
 
  LIKE | 
  
   
Returns true if the character pattern matches
  the given value. 
 | 
 
  BETWEEN..AND | 
  
   
Returns true if the value is in the given range. 
 | 
 
  IN | 
  
   
Returns true if the value is in the list. 
 | 
 
  IS NULL | 
  
   
Return true if the value is NULL. 
 | 
 
Table 1:
Relational Operators.
In order to combine two conditions, logical
operators – AND and OR are used. When two conditions are combined with AND then
both the conditions must be true to make the entire condition true. If
conditions are combined with OR then if any one condition is true then the
entire condition will be true.
The following are valid conditions:
    If amt
> 5000 then   
    If
rate > 500 and qty < 10 then  
    If
rate between 100 and 200 then
Now, let us write a simple PL/SQL block that
uses IF statement.
The following program will increase the course
fee of Oracle by 10% if more than 100 students have joined for Oracle,
otherwise it will decrease the course fee by 10%.
declare
  
v_ns  number(5);
begin
    -- get
no. of students of the course
   
select  count(*) into v_ns
    from
students
   
where  bcode in ( select bcode
from  batches
                      where  ccode = 'ora');
   
if  v_ns > 100 then
          
update courses set fee = fee * 1.1 
          
where  ccode = 'ora';
    else
          
update courses set fee = fee * 0.9
          
where  ccode = 'ora';
    end
if;
   
commit;
end;
/
The above block uses IF statement to check
whether the variable V_NS is greater than 100. If the condition is satisfied it
will increase the course fee by 10% otherwise it will decrease the course fee
by 10%.
The above program will either increase the
course fee by 10% or decrease it by 10%. 
That means it will take either of two possible
actions. But in some cases we may have more than two actions. For instance,
what if we have to change the course fee as follows based on the number of
students joined in Oracle course:
No. of Students          Percentage of change
>100                            Increase
by 20
>50                              Increase
by 15
>10                              Increase
by 5
<=10                           Decrease
by 10
The following program will change course fee of
Oracle according to the above table.
declare
  
v_ns  number(5);
   v_fee
courses.fee%type;
begin
    -- get
no. of students of the course
   
select  count(*) into v_ns
    from
students
   
where  bcode in ( select bcode
from  batches
                      where  ccode = 'ora');
    select
fee into v_fee
   
from   courses
   
where  ccode = 'ora';
   
if  v_ns > 100 then
             
v_fee := v_fee * 1.2;  -- 20%
   
elsif  v_ns > 50 then
             
v_fee := v_fee * 1.15;  -- 15%
   
elsif  v_ns > 10 then
             
v_fee := v_fee * 1.15;  -- 15%
    else
             
v_fee := v_fee * 0.90;  -- 10%
decrease
    end
if;
    --
update fee in table
    update
courses set fee = v_fee
   
where  ccode = 'ora';
end;
/
The above program first checks whether the
number of students is more than 100. If so, it increases course fee by 20%. If
the first condition is not satisfied then it checks whether second condition is
true (v_no > 50) and if so it executes the statement after that ELSIF. 
The IF statement will be terminated once a
condition is true and the corresponding statements are executed. 
If none of the conditions is true then it
executes statements given after ELSE. 
Every IF must have a matching END IF. However,
ELSIF that is used to check for a condition need not have corresponding END IF.
Also note that ELSIF can be used only after an IF is used. 
Apart from checking condition and executing
statements depending on the result of the condition, PL/SQL also allows you to
repeatedly execute a set of statements. 
Repeatedly executing a set of statements is called as looping structure.
In the next few sections we will discuss about
looping structures.
LOOP 
This is used to repeatedly execute a set of
statements.  This is the simplest form of
looping structures.
LOOP
    
Statements;
END LOOP;
1.           
Note: Loop… End Loop has no termination
point. So unless you terminate loop using EXIT command (discussed next) it
becomes an infinite loop.
Statements are the statements that are to be
repeatedly executed. In case of LOOP, these statements must make sure they exit
the loop at one point or other. Otherwise the statements will be executed
indefinitely.
EXIT
This is used to exit out of a Loop. This is
mainly used with LOOP statement, as there is no other way of terminating the
LOOP.
The following is the syntax of EXIT command.
EXIT 
[WHEN condition];
If EXIT is used alone, it will terminate the
current loop as and when it is executed. 
If EXIT is used with WHEN clause, then the
current loop is terminated only when the
condition given after WHEN is satisfied.
The following examples show how you can use EXIT
and EXIT WHEN to exit a Loop.
Example 1:
LOOP
       
...
        IF
count > 10 THEN
           
EXIT;    --  terminates 
loop 
       
END IF;
       
...
END  LOOP;
Example 2:
LOOP
       
...
        EXIT WHEN count >10; -- terminates loop 
       
...
END LOOP;
The following program will display numbers 1 to
10 using LOOP. 
declare
     i
number(2) := 1;
begin
     loop 
        
dbms_output.put_line(i);
         i
:= i + 1;
        
exit when i > 10;
     end
loop;
end;
/
In the above program, we first initialized
variable I to 1. Then LOOP starts and displays the value of I on
the screen. Then I is incremented by one. EXIT statement checks whether I
is greater than 10. If the condition is true then EXIT is executed and LOOP is
terminated otherwise it enters into loop again and redisplays the value of I.
Nested Loops
It is possible to have a loop within another
loop.  When a loop is placed within
another loop it is called as nested loop.  The inner loop is executed for each iteration
of outer loop.
The following example will display table up to
10 for numbers from 1 to 5.
declare
    i
number(2);
    j
number(2);
begin
    i :=
1;
    loop
       j:=
1;
      
loop
         
dbms_output.put_line(i || '*' || j || '=' || i * j);
         
j := j + 1;
         
exit when j > 10;
       end
loop;
       i
:= i + 1;
      
exit when i > 5;
    end
loop;
end;
/
Exiting from nested loop
It is possible to exit current loop using EXIT
statement. It is also possible to use EXIT statement to exit any enclosing
loop.  This is achieved using loop
label. 
A loop label is a label that is assigned to a
loop. By using this label that is assigned to a loop, EXIT can exit a specific
loop instead of the current loop.
The following example uses EXIT to exit the
outer loop.
<<outerloop>>
LOOP
   ...
   LOOP
      ...
      EXIT outerloop WHEN ...  – exits outer loop
 
   END LOOP;
   ...
END LOOP;
EXIT statement uses label to specify which
enclosing loop is to be terminated. EXIT uses outerloop, which is the
label given to outer loop, to terminate outer loop.
WHILE
Executes a series of statements as long as the
given condition is true. 
  WHILE
condition LOOP
       
Statements;
  END
LOOP;
As long as the condition is true then
statements will be repeatedly executed. Once the condition is false then loop
is terminated.
The following example will display numbers from
1 to 10.
declare
     i number(2) := 1;
begin
     while 
i <= 10
     loop 
         dbms_output.put_line(i);
         i := i + 1;
     end loop;
end;
/
As long as the condition (I<=10) is true
statements given within LOOP and END LOOP are executed repeatedly.  
The condition is checked at the beginning of
iteration. Statements are executed only when the condition is true otherwise
loop is terminated. 
FOR 
This looping structure is best suited to cases
where we have to repeatedly execute a set of statements by varying a variable
from one value to another.
FOR counter
IN [REVERSE] lowerrange .. upperrange  
LOOP
         Statements;
END LOOP;
lowerrange  and   upperrange
 may also be expressions. 
FOR loop sets counter to lower range and
checks whether it is greater than upper range. If counter is less than
or equal to upper range then statements given between LOOP and END LOOP will be
executed.  At the end of execution of
statements, counter will be incremented by one and the same process will
repeat.
The following is the sequence of steps in FOR
LOOP.
Steps
The following is the sequence in which FOR will
take the steps.
2.   
Counter is set  to 
lowerrange.
3.   
If counter is less than or
equal to  upperrange  then 
statements are executed otherwise 
loop is terminated.
4.   
Counter is incremented by one
and only one. It is not possible to increment counter by more than one.
5.   
Repeats step2.
The following example will display numbers from
1 to 10.
begin
    for i
in 1..10
    loop 
        
dbms_output.put_line(i);
    end
loop;
end;
/
If REVERSE option is used the following steps
will take place:
1.   
Counter is set to upper range.
2.   
If counter is greater than or
equal to lower range then statements are executed otherwise loop is terminated.
3.   
Counter is decremented by one.
4.   
Go to step 2.
The following FOR loop uses REVERSE option to
display number from 10 to 1.
begin
    for i
in REVERSE 1..10
    loop 
        
dbms_output.put_line(i);
    end
loop;
end;
/
5.           
Note: It is not possible to change the step value for FOR loop.
Sample program using FOR loop
The following example will display the missing
roll numbers. The program starts at lowest available roll number and goes up to
largest roll number. It will display the roll numbers that are within in the
range and not in the STUDENTS table.
declare
 
v_minrollno  students.rollno%type;
 
v_maxrollno  students.rollno%type;
 
v_count      number(2);
begin
  -- get
min and max roll numbers
 
select  min(rollno) , max(rollno)
into  v_minrollno, v_maxrollno
 
from  students;
  for
i  in v_minrollno .. v_maxrollno
  loop
     
select count(*) into v_count
      from
students 
     
where rollno = i;
      --
display roll number if count is 0
     
if  v_count = 0 then
           
dbms_output.put_line(i);
      end
if;
  end
loop;
end;
/
The above program takes minimum and maximum roll
numbers using MIN and MAX functions. Then it sets a loop that starts at minimum
roll number and goes up to maximum roll number. In each iteration it checks
whether there is any student with the current roll number (represented by
variable i). If no row is found then COUNT (*) will be 0. So it displays
the roll number if count is zero.
GOTO statement
Transfers control to the named label.  The label must be unique and should precede
an executable PL/SQL statement or PL/SQL block.
The following example shows how to create label
and how to transfer control to the label using GOTO statement.
BEGIN
           
...
           
GOTO   change_details;
           
...
          
<<change_details>>
          
update  students  ... ;
END;
GOTO statement transfers control to UPDATE
statement that is given after the label change_details 
Label is created by enclosing a name within two
sets of angle brackets (<< >>). The label must be given either
before an executable PL/SQL statement or a block.
Restrictions
The following are the restrictions on the usage
of GOTO statement. 
q  Cannot branch into an IF statement
q  Cannot branch into a LOOP
q  Cannot branch into a Sub block.
q  Cannot branch out of a subprogram – a procedure or function.
q  Cannot branch from exception handler into current block.
The following is an invalid usage of GOTO statement as it tries to enter into an IF
block:
BEGIN
         
...
        
/* following  is  invalid because GOTO can not
           
branch into  an IF statement */
          
GOTO change_details;  
          
...
          
IF  condition  THEN
                
...
               
<<change_details>>
               
update  students  ... ;
                
...
           END IF;
END;
Summary
Any programming language has basic control
structures like IF statement, looping structures etc. These control structures
are an important part of PL/SQL, because they allow data processing.  In this chapter, we have covered basic
control structure, but the practical usage of these control constructs will be
better understood as you write more programs.
No comments:
Post a Comment