Saltar la navegación

2.4.- Estructuras de control (I).

En la vida constantemente tenemos que tomar decisiones que hacen que llevemos a cabo unas acciones u otras dependiendo de unas circunstancias o repetir una serie de acciones un número dado de veces o hasta que se cumpla una condición. En PL/SQL también podemos imitar estas situaciones por medio de las estructuras de control que son sentencias que nos permiten manejar el flujo de control de nuestro programa, y éstas son dos: condicionales e iterativas.

Control condicional.

Las estructuras de control condicional nos permiten llevar a cabo una acción u otra dependiendo de una condición. Prueba los ejemplos para entender bien el funcionamiento. El caracter / que aparece al final se utiliza para ejecutar el bloque desde SQLPlus.

SENTENCIA IF.  Sus variantes son: 

  • Sentencia IF-THEN: Forma más simple de las sentencias de control condicional. Si la evaluación de la condición es TRUE, entonces se ejecuta la secuencia de sentencias encerradas entre el THEN y el final de la sentencia.

Sintaxis:

IF condicion THEN
secuencia_de_sentencias;
END IF;

Ejemplo:

SET SERVEROUTPUT ON
DECLARE a integer:=10; 
B integer:=7; 
BEGIN 
IF a>b
 THEN dbms_output.put_line(a || ' es mayor'); -- Como la función put_line solo imprime un valor utilizamos la concatenación || para que sea un único valor
 END IF; 
END;
/
  • Sentencia IF-THEN-ELSE: Con esta forma de la sentencia ejecutaremos la primera secuencia de sentencias si la condición se evalúa a TRUE y en caso contrario ejecutaremos la segunda secuencia de sentencias.

Sintaxis:

IF condicion 
THEN Secuencia_de_sentencias1;
 ELSE Secuencia_de_sentencias2; 
END IF;

Ejemplo:

DECLARE
a integer:=10;
b integer:=17;
BEGIN
IF a>b THEN
  dbms_output.put_line(a || ' es mayor');
ELSE
  dbms_output.put_line(b || ' es mayor o iguales');
END IF;
END;
/ 
  • Sentencia IF-THEN-ELSIF: Con esta última forma de la sentencia condicional podemos hacer una selección múltiple. Si la evaluación de la condición 1 da TRUE, ejecutamos la secuencia de sentencias 1, sino evaluamos la condición 2. Si esta evalúa a TRUE ejecutamos la secuencia de sentencias 2 y así para todos los ELSIF que haya. El último ELSE es opcional y es por si no se cumple ninguna de las condiciones anteriores.

Sintaxis:

IF condicion1 THEN
     Secuencia_de_sentencias1;
ELSIF condicion2 THEN
     Secuencia_de_sentencias2;
     ...
[ELSE
     Secuencia_de_sentencias;]
END IF;

Ejemplo:

IF (operacion = ‘SUMA’) THEN
     resultado := arg1 + arg2;
ELSIF (operacion = ‘RESTA’) THEN
     resultado := arg1 – arg2;
ELSIF (operacion = ‘PRODUCTO’) THEN
     resultado := arg1 * arg2;
ELSIF (arg2 <> 0) AND (operacion = ‘DIVISION’) THEN
     resultado := arg1 / arg2;
ELSE
     RAISE operacion_no_permitida; -- Lanza un error de ejecución
END IF;
/

Se llama flujo de control al orden en el que se ejecutan las instrucciones de un programa, siendo las propias instrucciones las que determinan o controlan dicho flujo. En un programa, a menos que el flujo de control se vea modificado por una instrucción de control, las instrucciones siempre se ejecutan secuencialmente, una detrás de otra

SENTENCIA CASE

Permite representar n sentencias IF anidadas, y es más fácil de interpretar cuando se compara con varios valores permitendo sustituir a las sentencias IF encadenadas.

Se puede utilizar de dos formas:

  • Utilizando un selector y un manejador WHEN para cada posible valor de ese selector

CASE  selector 
                    WHEN  expression1  THEN 
                    ordenes; 
                    [ WHEN  expression2 THEN 
                    ordenes; 
                    ... 
                    [WHEN  expression  THEN 
                    ordenes;] 
                    [ ELSE 
                    ordenes;] 
                    END CASE ;
  • Utilizando condiciones de búsqueda:
CASE 
WHEN  condición1  THEN 
ordenes; 
[ WHEN  condición2  THEN 
ordenes; 
... 
WHEN  condiciónN  THEN 
ordenes;] 
[ ELSE 
ordenes;] 
END CASE ;

En cualquiera de las dos formas, antes de terminar la sentencia CASE se puede especificar ELSE por si no se ha cumplido ninguna de las condiciones o el valor del selector no ha coincidido con ninguno de los evaluados. Las condicionescondicion1 a condicionN, son analizadas en el mismo orden en que aparecen listadas y, en el momento en que una de estas condiciones se cumple como verdadera, la sentencia CASE devuelve el resultado correspondiente y deja de analizar el resto de condiciones.

Ejemplo:

DECLARE
    nota INTEGER:=8; -- Se podría especificar nota INTEGER:=&nota
BEGIN
    CASE
       WHEN nota in(1,2) THEN
            DBMS_OUTPUT.PUT_LINE('Muy deficiente');
       WHEN nota in (3,4) THEN
            DBMS_OUTPUT.PUT_LINE('Insuficiente');
       WHEN nota = 5 THEN
            DBMS_OUTPUT.PUT_LINE('Suficiente');
       WHEN nota=6 THEN
            DBMS_OUTPUT.PUT_LINE('Bien');
        WHEN nota in(7,8) THEN
            DBMS_OUTPUT.PUT_LINE('Notable');
        WHEN nota in (9,10) THEN
            DBMS_OUTPUT.PUT_LINE('Sobresaliente');
      ELSE
            DBMS_OUTPUT.PUT_LINE('Error, no es una nota');
    END CASE;
END;
/

Para pedir datos por teclado en PL/SQL se utilizarán variables de sustitución escribiendo el caracter especial '&' y a continuación un identificador.  Si el dato que se va a recibir es una cadena formada por caracteres alfanuméricos, se deben incluir las comillas al definir la expresión. 

DECLARE
cadena varchar2(25) :='&cad';
BEGIN
    DBMS_OUTPUT.PUT_LINE(cadena);
END;
/

Autoevaluación

Pregunta

En PL/SQL no existen sentencias que nos permitan tomar una acción u otra dependiendo de una condición.

Respuestas

Verdadero.

Falso.

Retroalimentación