Oracle BUCLE PL/SQL con ejemplo
ยฟQuรฉ son los bucles?
Los bucles permiten que una determinada parte del cรณdigo de un programa se ejecute la cantidad de veces deseada.
En este tutorial, veremos el concepto de bucle en PL/SQL y el flujo de control en bucles.
Introducciรณn al concepto de bucles
El concepto de bucles proporciona la siguiente ventaja en la codificaciรณn.
- Reutilizaciรณn del cรณdigo
- Tamaรฑo de cรณdigo reducido
- Fรกcil flujo de control
- Complejidad reducida
El siguiente diagrama muestra el concepto de bucle de forma grรกfica.
En el diagrama anterior, se verificarรก la condiciรณn del bucle y, siempre que se cumpla la condiciรณn del bucle, se ejecutarรก el bloque de ejecuciรณn.
En cada iteraciรณn, la variable del contador de bucle que realmente decide la condiciรณn del bucle debe modificarse para que el control salga del bucle. En algunos casos, esta variable de contador de bucle es un operador de incremento/disminuciรณn para un recuento predefinido y, en algunos casos, es una condiciรณn de bรบsqueda que continรบa ejecutando el bloque hasta que lo satisface.
Declaraciones de control de bucle
Antes de aprender el concepto de bucles, es obligatorio conocer las declaraciones de control de bucles. Las declaraciones de control de bucle son aquellas que realmente controlan el flujo de ejecuciรณn dentro del bucle. A continuaciรณn se muestra la descripciรณn detallada de las declaraciones de control de bucle.
CONTINUAR
Esta palabra clave envรญa una instrucciรณn al motor PL/SQL que cada vez que el motor PL/SQL encuentre esta palabra clave dentro del bucle, omitirรก el cรณdigo restante en el bloque de ejecuciรณn del cรณdigo y la siguiente iteraciรณn comenzarรก inmediatamente. Esto se utilizarรก principalmente si el cรณdigo dentro del bucle desea omitirse para ciertos valores de iteraciรณn.
SALIR / SALIR CUANDO
Esta palabra clave envรญa una instrucciรณn al motor PL/SQL que cada vez que el motor PL/SQL encuentre esta palabra clave, saldrรก inmediatamente del bucle actual. Si el motor PL/SQL encuentra EXIT en un bucle anidado, entonces saldrรก del bucle en el que se ha definido, es decir, en un bucle anidado, al dar EXIT en el bucle interno solo se saldrรก del control del bucle interno, pero no desde el bucle exterior. 'SALIR CUANDO' va seguido de una expresiรณn que da un resultado booleano. Si el resultado es VERDADERO, entonces el control SALDRร.
GOTO
Esta instrucciรณn transferirรก el control a la instrucciรณn etiquetada (โGOTO ;โ). Esto tiene las siguientes restricciones
- La transferencia de control sรณlo se puede realizar dentro de los subprogramas.
- La transferencia de control no se puede realizar desde la parte de manejo de excepciones a la parte de ejecuciรณn.
No se recomienda el uso de esta declaraciรณn a menos que no haya otras alternativas, ya que la trazabilidad del control del cรณdigo serรก muy difรญcil en el programa debido a la transferencia de control de una parte a otra.
Tipos de bucle en PL/SQL
PL / SQL Proporciona los siguientes tres tipos de bucles
- Declaraciรณn de bucle bรกsico
- Para declaraciรณn de bucle
- Declaraciรณn de bucle while
Declaraciรณn de bucle bรกsico
Esta declaraciรณn de bucle es la estructura de bucle mรกs simple en PL/SQL. El bloque de ejecuciรณn comienza con la palabra clave "LOOP" y termina con la palabra clave "END LOOP".
La condiciรณn de salida debe darse dentro de este bloque de ejecuciรณn para que el control salga del bucle.
Necesita que la palabra clave EXIT se proporcione explรญcitamente en la parte de ejecuciรณn para salir del bucle.
LOOP <execution block starts> <EXIT condition based on developer criteria> <execution_block_ends> END LOOP;
Explicaciรณn de sintaxis:
- En la sintaxis anterior, la palabra clave "LOOP" marca el comienzo del bucle y "END LOOP" marca el final del bucle.
- El bloque de ejecuciรณn contiene todo el cรณdigo que debe ejecutarse, incluida la condiciรณn de SALIDA.
- La parte de ejecuciรณn puede contener cualquier declaraciรณn de ejecuciรณn.
Nota: La declaraciรณn de bucle bรกsica sin palabra clave EXIT serรก un BUCLE INFINITO que nunca se detendrรก.
Ejemplo :En este ejemplo, vamos a imprimir nรบmeros del 1 al 5 mediante una instrucciรณn de bucle bรกsica. Para ello, ejecutaremos el siguiente cรณdigo.
DECLARE
a NUMBER:=1;
BEGIN
dbms_output.put_line('Program started.');
LOOP
dbms_output.put_line(a);
a:=a+1;
EXIT WHEN a>5;
END LOOP;
dbms_output.put_line('Program completed');
END:
/
Explicaciรณn del cรณdigo:
- Lรญnea de cรณdigo 2: Declarar la variable 'a' como tipo de datos 'NรMERO' e inicializarla con el valor '1'.
- Lรญnea de cรณdigo 4: Imprimiendo el mensaje โPrograma iniciadoโ.
- Lรญnea de cรณdigo 5: La palabra clave 'LOOP' marca el comienzo del bucle.
- Lรญnea de cรณdigo 6: Imprime el valor de 'a'.
- Lรญnea de cรณdigo 7: Incrementa el valor de 'a' en +1.
- Lรญnea de cรณdigo 8: Comprueba si el valor de 'a' es mayor que 5.
- Lรญnea de cรณdigo 9: La palabra clave 'END LOOP' marca el final del bloque de ejecuciรณn.
- El cรณdigo de la lรญnea 6 a la lรญnea 8 continuarรก ejecutรกndose hasta que 'a' alcance el valor 6, ya que la condiciรณn devolverรก VERDADERO y el control SALIRร del bucle.
- Lรญnea de cรณdigo 10: Imprimir la declaraciรณn โPrograma completadoโ
Etiquetado de bucles
En PL/SQL, los bucles se pueden etiquetar. La etiqueta debe estar entre โ>โ. El etiquetado de bucles, especialmente en cรณdigos de bucles anidados, proporcionarรก una mayor legibilidad. La etiqueta se puede proporcionar en el comando EXIT para salir de ese bucle en particular. Usando la etiqueta, se puede hacer que el control salga directamente del bucle externo de los bucles anidados desde cualquier lugar dentro de los bucles, dando el comando de salida seguido de la etiqueta del bucle externo.
<<OUTER_LOOP>> LOOP <execution_block_starts> . <<INNER_LOOP>> LOOP --inner <execution_part> END LOOP; . <executi_block_ends> END LOOP;
Explicaciรณn de sintaxis:
- En la sintaxis anterior, el bucle de salida tiene un bucle mรกs dentro.
- El '>' y el '>' son las etiquetas de estos bucles.
Ejemplo :En este ejemplo, vamos a imprimir un nรบmero a partir del 1 utilizando la declaraciรณn de bucle bรกsico. Cada nรบmero se imprimirรก tantas veces como su valor. El lรญmite superior de la serie se fija en la parte de declaraciรณn del programa. Aprendamos cรณmo podemos usar el concepto de etiqueta para lograr esto. Para eso, ejecutaremos el siguiente cรณdigo
DECLARE
a NUMBER:=0;
b NUMBER;
upper-limit NUMBER :=4;
BEGIN
dbms_output.put_line(โProgram started.' );
ยซouterloopยปโญ โฌ
LOOP
a:=a+1;
b:=l;
ยซinner loopยป
LOOP
EXIT outer_loop WHEN a > upper_limit;
dbms_output.put_line(a);
b:=b+l;
EXIT inner_loop WHEN b>a;
END LOOP;
END LOOP;
dbms_output.put_line('Program completed.');
END;
/
Explicaciรณn del cรณdigo:
- Lรญnea de cรณdigo 2-3: Declarar la variable 'a' y 'b' como tipo de datos 'NรMERO'.
- Lรญnea de cรณdigo 4: Declarar la variable 'upper_limit' como tipo de datos 'NรMERO' con valor '4'
- Lรญnea de cรณdigo 6: Imprimiendo el mensaje โPrograma iniciadoโ.
- Lรญnea de cรณdigo 7: El bucle exterior ha sido etiquetado como "outer_loop"
- Lรญnea de cรณdigo 9: El valor de 'a' se incrementa en 1.
- Lรญnea de cรณdigo 11: El bucle interno ha sido etiquetado como "inner_loop".
- Lรญnea de cรณdigo 13: Condiciรณn de SALIDA que verifica si el valor 'a' es mayor que el valor 'lรญmite_superior'. De lo contrario, irรก mรกs lejos; de lo contrario, saldrรก directamente del bucle exterior.
- Lรญnea de cรณdigo 14: Imprimiendo el valor de 'b'.
- Lรญnea de cรณdigo 15: Incrementa el valor de 'b' en +1.
- Lรญnea de cรณdigo 16: Condiciรณn de SALIDA que comprueba si el valor de 'b' es mayor que 'a'. Si es asรญ, saldrรก del control del bucle interno.
- Lรญnea de cรณdigo 14: Imprimir la declaraciรณn โPrograma completadoโ
Resumen
| el Bucle | Bucle bรกsico |
| Criterio de salida | Salga cuando encuentre la palabra clave "EXIT" en la parte de ejecuciรณn |
| Uso | Es bueno usarlo cuando la salida no se basa en ninguna condiciรณn en particular. |






