98 - Control de flujo (if)


Problema:

Un profesor almacena las notas de sus alumnos en una tabla denominada "notas".

Eliminamos la tabla:

 drop table notas;

Creamos la tabla con la siguiente estructura:

 create table notas(
  nombre varchar2(30),
  nota number(4,2)
 );

Ingresamos algunos registros:

 insert into notas values('Acosta Ana', 6.7);
 insert into notas values('Bustos Brenda', 9.5);
 insert into notas values('Caseros Carlos', 3.7);
 insert into notas values('Dominguez Daniel', 2);
 insert into notas values('Fuentes Federico', 8);
 insert into notas values('Gonzalez Gaston', 7);
 insert into notas values('Juarez Juana', 4);
 insert into notas values('Lopez Luisa',5.3);

Creamos o reemplazamos la función "f_condicion" que recibe una nota y retorna una cadena de caracteres indicando si aprueba o no:

create or replace function f_condicion (anota number)
  return varchar2
 is
  condicion varchar2(20);
 begin
   condicion:='';
   if anota<4 then
    condicion:='desaprobado';
   else condicion:='aprobado';
   end if;
   return condicion;
 end;

Realizamos un "select" sobre "notas" mostrando el nombre y nota del alumno y en una columna su condición (empleando la función creada anteriormente):

 select nombre, nota, f_condicion(nota) from notas;

En el siguiente ejemplo omitimos la cláusula "else" porque sólo indicaremos acciones en caso que el "if" sea verdadero:

create or replace function f_condicion (anota number)
  return varchar2
 is
  condicion varchar2(20);
 begin
   condicion:='aprobado';
   if anota<4 then
    condicion:='desaprobado';
   end if;
   return condicion;
 end;

Realizamos el "select" sobre "notas" mostrando la misma información que antes:

 select nombre, nota, f_condicion(nota) from notas;

En el siguiente ejemplo colocamos un "if" dentro de otro "if". En el cuerpo de la función controlamos si la nota es menor a 4 (retorna "desaprobado"), luego, dentro del "else", controlamos si la nota es menor a 8 (retorna "regular") y si no lo es ("else"), retorna "promocionado":

create or replace function f_condicion (anota number)
  return varchar2
 is
  condicion varchar2(20);
 begin
   condicion:='';
   if anota<4 then
     condicion:='desaprobado';
   else
     if anota<8 then
      condicion:='regular';
     else
      condicion:='promocionado';
     end if;
   end if;
   return condicion;
 end;

Realizamos el "select" sobre "notas" mostrando la misma información que antes:

 select nombre, nota, f_condicion(nota) from notas;

Simplificamos la función anteriormente creada empleando la sintaxis "if...elsif":

create or replace function f_condicion (anota number)
  return varchar2
 is
  condicion varchar2(20);
 begin
   condicion:='';
   if anota<4 then
     condicion:='desaprobado';
   elsif anota<8 then
     condicion:='regular';
   else
    condicion:='promocionado';
   end if;
   return condicion;
 end;

Realizamos el "select" sobre "notas" mostrando la misma información que antes:

 select nombre, nota, f_condicion(nota) from notas;

Retornar