Bucles While, For y Loop en PL/SQL

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.

 

Compartir

4 comentarios

  1. fran

    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?

  2. Catalina Cano

    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;

  3. Patty

    Esta genial tu post, mil gracias!!!!

  4. Roberto Descalzo

    Muy bien explicado.
    Muchas gracias.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *