Loops en PL/SQL

Los bucles son una secuencia de instrucciones que se van a repetir hasta que se cumpla una condición que lo termine. Se realizan todas las operaciones pertinentes, alguna inserción, actualización, consulta, etc. y posteriormente se verifica la condición, esto podría hacerse con un contador que va aumentando y de ahí se verifica la condición establecida.

PL/SQL maneja los siguientes tipos de loops:

  • BASIC LOOP.
  • FOR LOOP.
  • WHILE LOOP.

De igual forma necesitamos comandos que nos saquen del bucle:

  • EXIT.
  • EXIT WHEN.

Basic Loop

Este primer tipo de bucle se utiliza encerrando las sentencias entre dos palabras LOOP y END LOOP. Con cada iteración, la secuencia de sentencias se ejecuta y luego el control se reanuda en la parte superior del bucle. A medida que se va ejecutando el loop, necesitamos ir verificando una condición que al cumplirse nos va a sacar del bucle y esa palabra es EXIT.

DECLARE
   lv_numero NUMBER := 0;
BEGIN
    LOOP  --apertura del loop
        DBMS_OUTPUT.PUT_LINE ('todo esto se está ejecutando en el loop: ' ||    lv_numero);
        lv_numero := lv_numero + 1; 
        IF lv_numero > 10 THEN --esta es la condición que vamos a evaluar para terminar el loop
            EXIT; -- acá vemos la sentencia exit
        END IF;
    END LOOP; --cierre del loop
END;
 

Resultado:

todo esto se esta ejecutando en el loop: 0

todo esto se esta ejecutando en el loop: 1

todo esto se esta ejecutando en el loop: 2

todo esto se esta ejecutando en el loop: 3

todo esto se esta ejecutando en el loop: 4

todo esto se esta ejecutando en el loop: 5

todo esto se esta ejecutando en el loop: 6

todo esto se esta ejecutando en el loop: 7

todo esto se esta ejecutando en el loop: 8

todo esto se esta ejecutando en el loop: 9

todo esto se esta ejecutando en el loop: 10

Statement processed.

0.00 seconds

Sentencia EXIT WHEN

Esta sentencia provoca la salida de la iteración. Actúa cuando la condición de su cláusula cláusula WHEN es verdadera, después transfiere el control al final del bucle actual. Cada vez que la ejecución del bucle llegue a la línea EXIT WHEN, se evaluará la condición de su cláusula para saber si termina el LOOP.

Vamos a hacer un ejemplo exactamente igual al anterior, con la diferencia que acá vamos a evaluar salir del bucle con EXIT WHEN:

DECLARE
   lv_numero NUMBER := 0;
BEGIN
   LOOP -- acá usamos abrimos el loop
      DBMS_OUTPUT.PUT_LINE ('todo esto se esta ejecutando en el loop: ' ||    lv_numero);
      lv_numero := lv_numero + 1; 
      EXIT WHEN lv_numero > 10; --esta es la condición que vamos a evaluar para terminar el loop
   END LOOP;
END;

Resultado:

todo esto se esta ejecutando en el loop: 0

todo esto se esta ejecutando en el loop: 1

todo esto se esta ejecutando en el loop: 2

todo esto se esta ejecutando en el loop: 3

todo esto se esta ejecutando en el loop: 4

todo esto se esta ejecutando en el loop: 5

todo esto se esta ejecutando en el loop: 6

todo esto se esta ejecutando en el loop: 7

todo esto se esta ejecutando en el loop: 8

todo esto se esta ejecutando en el loop: 9

todo esto se esta ejecutando en el loop: 10

Statement processed.

0.00 seconds

FOR LOOP

Con esta instrucción podremos hacer exactamente lo mismo que con el BASIC LOOP, pero las sintaxis será diferente. Todo el bloque de código que queremos que se repita irá dentro del FOR LOOP y END LOOP. La forma de trabajar es sumamente sencilla.

En el siguiente ejemplo vamos a imprimir el valor del índice del ciclo for y al final mostraremos una sumatoria que se va incrementando dentro del FOR LOOP:

DECLARE
    l_sumatoria NUMBER(2):= 0;
BEGIN
    FOR LOOP IN 1..10 LOOP -- inicio del bucle con el rango de ejecución
        DBMS_OUTPUT.put_line ('impresión número: '|| LOOP);     
        l_sumatoria:= l_sumatoria + TO_NUMBER(LOOP);         
    END LOOP; --fin del bucle
    DBMS_OUTPUT.put_line ('sumatoria: '|| l_sumatoria);
END;

Resultado:

impresión número: 1

impresión número: 2

impresión número: 3

impresión número: 4

impresión número: 5

impresión número: 6

impresión número: 7

impresión número: 8

impresión número: 9

impresión número: 10

sumatoria: 55

Statement processed.

0.00 seconds

Reverse FOR LOOP Statement

Lo más común es que el FOR LOOP vaya desde un número menor hasta uno mayor. Por ejemplo, desde el 1 hasta el 10. También tenemos la opción de ir en sentido contrario, podríamos ir del número 10 al 1. Veamos el siguiente ejemplo del REVERSE FOR LOOP:

BEGIN
   FOR i IN REVERSE 1..4 LOOP
      DBMS_OUTPUT.PUT_LINE (i);
   END LOOP;
END;

Resultado:

4

3

2

1

Statement processed.

0.00 seconds

WHILE LOOP

La sentencia WHILE LOOP se ejecutará repetidamente mientras una condición dada sea verdadera.

Vamos a hacer el mismo ejemplo de siempre y veremos que cuando la condición que hemos establecido ya no se cumpla, se terminará el WHILE LOOP:

DECLARE
    l_sumatoria NUMBER(3):= 0;
    i NUMBER(2):= 1;
BEGIN
    WHILE i <= 4 LOOP
        DBMS_OUTPUT.put_line(i);
        l_sumatoria:= l_sumatoria + i;    
        i := i + 1;
    END LOOP;
    DBMS_OUTPUT.put_line('la sumatoria total es: '||l_sumatoria);
END;

Resultado:

4

3

2

1

la sumatoria total es: 10

Statement processed.

0.00 seconds