Hola a todos, hoy vamos a ver como funcionan los bucles o estructuras repetitivas en PL/SQL.
Como en la mayoría de lenguajes, tenemos estructuras repetitivas o bucles.
Tenemos el while y for, como en el resto de lenguajes. Pero en PL/SQL tenemos uno nuevo llamado loop, que lo vamos a ver.
While
Igual que en otros lenguajes, esta es su sintaxis:
WHILE condition LOOP {...statements...} END LOOP;
Fíjate que en PL/SQL, se pone LOOP, en todos los tipos de bucles se pone LOOP.
Vamos a ver un pequeño ejemplo. Mostrar los números del 1 al 10.
declare i number(8) := 1; begin while (i<=10) loop DBMS_OUTPUT.PUT_LINE(i); i := i+1; end loop; end; /
For
Tiene esta sintaxis en PL/SQL:
FOR loop_counter IN [REVERSE] lowest_number..highest_number LOOP {...statements...} END LOOP;
Veamos un ejemplo:
begin for i in 1..10 loop DBMS_OUTPUT.PUT_LINE(i); end loop; end; /
La i es una variable local que solo se usa dentro del for, para decir que vaya de 1 a 10, lo hacemos asi: 1..10
Como siempre tenemos que poner Loop.
Si quieres que se inviertan los valores usamos reverse:
begin for i in reverse 1..10 loop DBMS_OUTPUT.PUT_LINE(i); end loop; end; /
Tambien se suele usar cuando tenemos rowtypes:
declare cursor prod_pedido is select p.nombre, dp.cantidad from productos p, detallepedidos dp where p.codigoproducto = dp.codigoproducto and dp.CODIGOPEDIDO = p_codigopedido; begin for registro in prod_pedido loop dbms_output.put_line('Se ha pedido del producto llamado ' || registro.nombre || ': ' || registro.cantidad || ' unidades'); end loop; end; /
Loop
La sintaxis de Loop en PL/SQL es:
LOOP {...statements...} END LOOP;
La particularidad de Loop es que podemos poner la condición de salida donde queramos dentro del bucle con exit when, cuando se cumpla la condición saldrá del bucle.
declare i number(8) := 1; begin loop DBMS_OUTPUT.PUT_LINE(i); exit when i=10; i := i+1; end loop; end; /
Este tipo de bucles se suele utilizar para recorrer cursores, por ejemplo:
declare v_nombrecliente clientes.nombrecliente%type; cursor clientes_cursor is select * from clientes; begin open clientes_sin_pagos_cursor; loop fetch clientes_cursor into v_nombrecliente; exit when clientes_cursor%notfound; dbms_output.put_line(v_nombrecliente); end loop; close clientes_cursor; end; /
Te dejo un vídeo de mi canal donde usamos bucles:
Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.
hola,
si quiero usar un for y no se cuantas filas hay, por ejemplo a la hora de imprimir un select, cómo le indico cunado debe pararse?
Esta es mi solucion:
SET SERVEROUTPUT ON;
DECLARE
numero_inicial NUMBER := 1;
limite CONSTANT NUMBER := 11;
numero_final NUMBER := 9;
i NUMBER := 1;
temp i%type;
BEGIN
dbms_output.put_line(‘TABLAS DE MULTIPLICAR DEL ‘ || numero_inicial ||’ AL NUMERO ‘|| numero_final);
dbms_output.put_line(‘FECHA: ‘|| sysdate);
<> LOOP
dbms_output.put_line(»);
dbms_output.put(numero_inicial
|| ‘*’
|| i
|| ‘=’
|| numero_inicial * i
|| chr(9));
temp:= numero_inicial+1;
<> LOOP
dbms_output.put(temp
|| ‘*’
|| i
|| ‘=’
|| temp * i
|| chr(9));
temp:=temp+1;
EXIT WHEN temp > numero_final;
END LOOP tabla_dos;
i := i + 1;
EXIT WHEN i > limite;
END LOOP tabla_inicial;
END;
Esta genial tu post, mil gracias!!!!
Muy bien explicado.
Muchas gracias.