Categorieën: Alle - condición - while - iteraciones

door Santiago Castro 3 jaren geleden

201

Sentencias de Control SQL

Los bucles en SQL, específicamente en PL/SQL, permiten iterar sobre una secuencia de instrucciones bajo ciertas condiciones. Hay dos tipos principales de bucles: WHILE y FOR. El bucle WHILE ejecuta las instrucciones mientras una condición sea verdadera, y su número de iteraciones es desconocido hasta que dicha condición sea falsa.

Sentencias de Control
SQL

UNIVERSIDAD ISRAEL Alumno Santiago Castro Base de Datos II Paralelo B

Ejercicio

Sentencias de Control SQL

WHILE-LOOP

La sentencia WHILE-LOOP, asocia una condición a una secuencia de instrucciones que se encuentran entre las palabras claves LOOP y END LOOP.
lgunos lenguajes tienen estructuras como LOOP UNTIL, o REPEAT UNTIL, las cuales evalúan la condición al final y no al principio de todo. PL/SQL no tiene esta estructura, sin embargo sería muy fácil simularla.

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;

WHILE condicion LOOP secuencia_de_instrucciones; 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.

CASE

La sentencia CASE permite evaluar diferentes opciones, por cada opción se realiza una instrucción específica.
SELECT CASE Expression When expression1 Then Result1 When expression2 Then Result2 ... ELSE Result END

FOR-LOOP

Al contrario que en el caso de un bucle WHILE, en el cual recordemos que el número de iteraciones era desconocido a priori, en un bucle FOR este número es conocido antes de comenzar la iteración. Los bucles FOR iteran un número de veces que está comprendido en un rango.
FOR contador IN [REVERSE] valor_minimo..valor_maximo LOOP secuencia_de_instrucciones; END LOOP;

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;

LOOP

Se trata de la variedad más simple de la sentencia LOOP, y se corresponde con el bucle básico (o infinito), el cual incluye una secuencia de sentencias entre las palabras claves LOOP y END LOOP. Veamos un ejemplo
EXIT

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.

EXIT-WHEN

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.

LOOP secuencia_de_sentencias; END LOOP;

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.

Topic principal

IF-THEN

Es la forma más sencilla de una sentencia IF. Asocia una secuencia de sentencias a una condición. Estructura
IF-THEN-ELSE

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.

IF-THEN-ELSIF

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.

IF condicion THEN secuencia_de_sentencias; END IF;

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...