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