によって Santiago Castro 3年前.
194
もっと見る
LOOP secuencia_de_instrucciones; EXIT WHEN expresion_booleana; END LOOP;
Para asegurarnos que un bucle de tipo WHILE se ejecuta por lo menos una vez, podemos implementarlo mediante una variable booleana de la siguiente forma
hecho:=FALSE; WHILE NOT hecho LOOP secuencia_de_instrucciones; hecho:=expresion_booleana; END LOOP;
Antes de cada iteración del LOOP, la condición se evalúa... si devuelve TRUE se continúa iterando, en caso de que devuelva FALSE o NULL, se forzará la salida del bucle. El número de iteraciones depende de la condición, y es desconocido hasta que el bucle termina. Puede haber 0 o N iteraciones hasta que la condición sea FALSE.
Dentro de un bucle FOR, el contador del bucle puede ser referenciado como una constante... por lo tanto, el contador puede aparecer en expresiones, pero no se le puede asignar ningún valor.
FOR ctr IN 1..10 LOOP IF NOT fin THEN INSERT INTO ... VALUES (ctr, ...); -- Válido... factor:=ctr*2; -- Válido... ELSE ctr:=10; -- No válido... END IF; END LOOP;
La sentencia EXIT provoca la salida de un bucle de forma incondicional. Cuando se encuentra un EXIT, el bucle acaba inmediatamente y el control pasa a la siguiente instrucción que esté fuera del bucle. Veamos un ejemplo:
LOOP ... IF limite_credito < 3 THEN ... EXIT; -- Fuerza la salida inmediata... END IF; END LOOP; -- El control pasaría a esta instrucción...
La sentencia EXIT siempre debe encontrarse dentro de un bucle LOOP. Para salir de un bloque PL/SQL que no sea un bucle antes de su finalización normal, podemos usar la sentencia RETURN.
La sentencia EXIT-WHEN, nos va a permitir salir de un bucle de forma condicional. Cuando PL/SQL encuentra una sentencia de este tipo, la condición del WHEN será evaluada... en caso de devolver TRUE, se provocará la salida del bucle... en caso contrario, se continuará la iteración.
LOOP FETCH c1 INTO ... EXIT WHEN c1%NOTFOUND; -- Salir si se cumple la condición ... END LOOP; CLOSE c1;
De forma parecida a lo que ocurría con los IF y los ELSIF, también podríamos controlar la salida de un bucle de otra forma, y no mediante un EXIT-WHEN... lo que ocurre es que, al igual que en el caso anterior, la utilización de esta sentencia facilitará la programación y lectura de nuestro código.
En cada iteración del bucle, se ejecutan todas las sentencias de forma secuencial. Evidentemente es raro que deseemos tener un bucle infinito en un programa, por tanto existe una manera de forzar la salida, y es la utilización de la palabra clave EXIT. Para esta palabra también tenemos dos variedades posibles: EXIT y EXIT-WHEN. Vamos a verlas en detalle.
Esta segunda variedad añade la palabra clave ELSE, seguida de un conjunto de sentencias. Veamos un ejemplo:
IF condicion THEN secuencia_1; ELSE secuencia_2; END IF;
Si la condición es TRUE, se ejecutará la secuencia de instrucciones 1, en caso contrario se ejecutará la 2. Las claúsulas THEN y ELSE pueden incluir sentencias IF, es decir, podemos agrupar sentencias de tipo IF.
Podemos agrupar sentencias de tipo IF... sin embargo, nos podemos encontrar el caso en que existan muchas posibles alternativas a evaluar, y para cada ELSE tendríamos que abrir una sentencia de tipo IF-THEN-ELSE, y cerrarla posteriormente... para evitar esto tenemos la palabra clave ELSIF.
IF condicion1 THEN secuencia_1; ELSIF condicion2 THEN secuencia_2; ELSE secuencia_3; END IF;
De esta manera, podemos evaluar tantas como queramos, y sólo deberemos cerrar una sentencia IF con el END IF correspondiente. La última sentencia ELSE se ejecutará cuando no se cumpla ninguna de las anteriores, aunque si no queremos ponerla, pues no pasa nada. Podemos agrupar tantos ELSIF como deseemos si ningún tipo de problema.
La secuencia de sentencias se ejecuta tan sólo si la condición es TRUE. Se pueden escribir las sentencias IF de forma completa en una sola línea...