Como PL/SQL es un lenguaje 3GL, cuenta con las estructuras típicas de control de flujo: bifurcaciones condicionales y bucles:

Índice

Bifurcaciones condicionales:



IF

La sintaxis básica es:

IF condición THEN
  Bloque de instrucciones;
[ELSIF condición THEN
  Bloque de instrucciones;]
...
[ELSE
  Bloque de instrucciones;]
END IF;

Como en cualquier lenguaje de programación, “condición” es cualquier expresión que de cómo resultado un valor booleano. Hay que saber que las estructuras IF se pueden anidar unas dentro de otras.

IF - THEN

Se evalúa la condición y si resulta verdadera, se ejecutan uno o más líneas de código de programa. En el caso de que la condición resulte falsa o nula, NO se realiza NINGUNA acción.

IF fecha_nac < '1-01-1970' THEN   --No termina con un ;
  Salario := salario *1.15;       --aumento de salario en un 15%
END IF;

Se pueden anidar varias instrucciones:

IF fecha_nac < 1-01-1970 THEN
  IF apellido =Martínez THEN
    salario:= salario *1.15;
  END IF;
END IF;

IF - THEN - ELSE

Se evalúa la condición y si resulta verdadera, se ejecutan uno o más líneas de código de programa. En el caso de que la condición resulte falsa, se ejecutan las instrucciones que siguen a la instrucción ELSE. Sólo se permite una instrucción ELSE en cada instrucción IF.

IF fecha_nac <1-01-1970 THEN
  salario:= salario *1.15;
ELSE
  salario:= salario* 1.05;
END IF;

IF - THEN - ELSIF

Se evalúa la condición y si resulta verdadera, se ejecutan uno o más líneas de código de programa. En el caso de que la condición resulte ser falsa, se evalúa la condición especificada en el ELSIF.

IF condicion THEN
  instrucciones;
ELSE
  IF condicion2 THEN
    instrucciones;
  ELSE
    IF condicion3 THEN
      instrucciones;
    END IF;
  END IF;
END IF;
IF apellido =Pérez THEN
  salario:= salario *1.10;     --aumento de salario en un 10%
ELSIF apellido =Martínez THEN
  salario:= salario *1.15;     --aumento de salario en un 15%
ELSIF apellido=Alvarez THEN
  salario:= salario *1.20;     --aumento de salario en un 20%
ELSE
  salario:= salario* 1.05;     --aumento de salario en un 5%
END IF;                        --Sólo se necesita un único END IF

CASE

La instrucción CASE puede evaluar múltiples expresiones y devolver para cada una de ellas un valor/bloque de instrucciones. El resultado de cada WHEN puede ser un valor o una sentencia, en el primer caso el resultado de una sentencia CASE se puede guardar en una variable.

Su sintaxis:

CASE variable
  WHEN expresión1 THEN valor1/bloque de instrucciones
  WHEN expresión2 THEN valor2/bloque de instrucciones
  WHEN expresión3 THEN valor3/bloque de instrucciones
  WHEN expresión4 THEN valor4/bloque de instrucciones
  ELSE valor5/bloque de instrucciones
END

Ejemplos:

CREATE TABLE C2(
  Nombre  VARCHAR2(20 ),
  EC      VARCHAR2(1)
);

COMMIT;
INSERT INTO C2 ( NOMBRE, EC ) VALUES ('Juan ', 'S');
INSERT INTO C2 ( NOMBRE, EC ) VALUES ('Maria', 'C');
INSERT INTO C2 ( NOMBRE, EC ) VALUES ('Ana', 'D');
INSERT INTO C2 ( NOMBRE, EC ) VALUES ('Luis', 'S');
INSERT INTO C2 ( NOMBRE, EC ) VALUES ('Pepe', NULL);
COMMIT;

SELECT Nombre, CASE EC
                    WHEN 'C' THEN 'Casado/a'
                    WHEN 'S' THEN 'Soltero/a'
                    WHEN 'D' THEN 'Divorciado/a'
                    ELSE 'Otros'
               END
               AS "Estado Civil"
FROM C2;

Otra sintaxis es:

CASE
  WHEN condición1 THEN expresión1/bloque de instrucciones
  WHEN condición2 THEN expresión2/bloque de instrucciones
  WHEN condición3 THEN expresión3/bloque de instrucciones
  WHEN condición4 THEN expresión4/bloque de instrucciones
  ELSE expresión5/bloque de instrucciones
END

En esta sintaxis después del CASE no aparece ninguna variable y cada WHEN tiene su propia condición a evaluar.

BUCLES

LOOP
  sentencias;
END LOOP;

Las sentencias de dentro del bucle se ejecutarán durante un número indefinido de vueltas, hasta que aparezca la instrucción EXIT; que finalizará el bucle. Este tipo de bucle se denomina bucle
incondicional.

LOOP
  Sentencias
  IF (expresion) THEN
    Sentencias
    EXIT;
  END IF;
END LOOP;

Otra opción es incluir la estructura EXIT WHEN condición, se terminará el bucle cuando la condición se cumpla:

LOOP
  Sentencias
  EXIT WHEN condición;
  Sentencias
END LOOP;

Ejemplo:

DECLARE -- Declaración y asignación de variables
  total NUMBER(9) := 0;
  counter NUMBER(6) := 0;
BEGIN
  LOOP
    counter := counter + 1; -- Incrementamos la variable contador
    total := total + counter * counter;
    -- Salimos del bucle cuando la condición de cumpla
    EXIT WHEN total &gt; 25000;
  END LOOP;

  DBMS_OUTPUT.PUT_LINE('Counter: ' || TO_CHAR(counter) || ' Total: ' || TO_CHAR(total));
END;

Un tipo de bucle más común son los bucles condicionales:

WHILE condicion LOOP
  Sentencias
END LOOP;

Ejemplo:

DECLARE
  i       NUMBER := 1;
  i_cubed NUMBER;
BEGIN
  WHILE i <= 10 LOOP
    i_cubed := i**3;
    DBMS_OUTPUT.PUT_LINE('Number: ' || TO_CHAR(i) || ' Cube: ' || TO_CHAR(i_cubed));
    i := i + 1;
  END LOOP;
END;

En los bucles WHILE también se pueden utilizar las órdenes EXIT o EXIT WHEN para salirnos sin esperar a que la condición devuelva un valor falso.

Y por último el bucle FOR:

FOR contador IN [REVERSE] limite_inferior..limite_superior LOOP
  sentencias
END LOOP;

Contador deberá ser una variable de tipo numérico que sea capaz de contener los valores comprendidos entre limite_inferior y limite_superior, los cuales deberán ser expresiones numéricas, ya sean constantes (1,10…) o funciones (ROUND(max,0), ASCII(‘A’)…) .

Si la variable contador no está definida, PL/SQL definirá una variable de tipo INTEGER al iniciar el bucle, y la liberará al finalizar el bucle.

SET SERVEROUTPUT ON;
BEGIN
  FOR loop_counter IN 1..10 LOOP
    DBMS_OUTPUT.PUT_LINE('Number: ' || TO_CHAR(loop_counter) || ' Square: ' || TO_CHAR(loop_counter**2));
    END LOOP;
END;

En el caso de especificar REVERSE el bucle se recorre en sentido inverso.

Siguiente tema: PL/SQL - Excepciones