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.

 

Etiquetas

2 comments

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

Deja un comentario

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