jueves, 18 de septiembre de 2014

Bucles

En programación, un Bucle es un tipo de estructura de control que permite repetir una o más sentencias múltiples veces. Todos los bucles se ejecutan mientras se cumpla una determinada condición , mientras esa condición sea verdadera, el bucle seguirá ejecutándose.

En PL/SQL tenemos a nuestra disposición los siguientes  bucles:
  • LOOP
  • WHILE
  • FOR

LOOP
El bucle LOOP, se repite tantas veces como sea necesario hasta que se fuerza su salida con la instrucción EXIT. Las sentencias dentro del bucle se ejecutarán durante un número indefinido de veces. Este tipo de bucle se denomina bucle incondicional.

LOOP
    -- Instrucciones
      IF (expresion) THEN
    -- Instrucciones
    EXIT;
      END IF;
   END LOOP;


WHILE
Un tipo de bucle más común son los bucles condicionales.  El bucle WHILE, se repite mientras  que se cumpla cierta condición.

WHILE (condicion) LOOP
      -- Instrucciones
  END LOOP;

FOR
El bucle FOR, se repite tanta veces como le indiquemos en  las variables de contador. Este contador deberá ser una variable de tipo numérico que sea capaz de contener los valores comprendidos entre limite_inferior y limite_superior, los cuales deberán ser expresiones numéricas, ya sean constantes (1,10…) o funciones (ROUND(max,0), ASCII(‘A’)…) .

FOR contador IN [REVERSE] inicio..final LOOP
       -- Instrucciones
 END LOOP;

En el caso de especificar REVERSE el bucle se recorre en sentido inverso.

LOOPS en 11G
En la versión 11g  podemos cancelar la iteración del loop actual y pasar a la siguiente, sin abortar el loop. Puede usarse simplemente CONTINUE o CONTINUE WHEN. En este último caso podremos evitar el uso de la sentencia IF para controlar la condición de salida de la iteración.

BEGIN
   LOOP
     ...
    CONTINUE WHEN condicion;  --vuelve al comienzo del loop
    -- si condicion=true, esta parte no se ejecuta
    ...
   END LOOP;
 END;

La ventaja de de usar este código  es que cualquier sentencia que se encuentre dentro del bucle entre el CONTINUE y el END LOOP no será ejecutada. Al no validar un caso termina el registro y pasa al siguiente registro del contador. Así facilitamos código y mejoramos el tiempo de lecturas. 

LOOP
  EXIT WHEN condicion;
  i:=i+1;
 
  var1 := getdata(i);
  CONTINUE WHEN NOT var1;

  var2 := convertdata(i);
  CONTINUE WHEN NOT var2;
  ....
  procesoRegistro(i);
 
END LOOP;

No hay comentarios:

Publicar un comentario