Revista Informática

Bucle WHILE (SQL Server - MySQL)

Publicado el 11 junio 2014 por Jamesrevelo @herprogramacion
La sentencia WHILE de SQL ejecuta una conjunto de instrucciones varias veces, mientras la condición por la cual se rige sea verdadera. Si en algún momento es falsa el bucle se termina.
MySQL - SQL Server WHILE
Como implemento la sentencia WHILE?Es sencillo!, primero debes tener en cuenta cual es la condición que deseas que sea verdadera y luego establecer que instrucciones son las que quieres ejecutar en cada iteración.
Recuerda que una iteración es un recorrido del ciclo desde el inicio hasta el final. Las sintaxis del WHILE varían entre motores. A continuación te muestro las de MySQL y SQL Server:

WHILE <condición>   instruciones

      [etiqueta:] WHILE <condición> DO   instruciones                  ENDWHILE[etiqueta]

      SQL Server                                 MySQL


MySQL permite la posibilidad de agregar etiquetas al WHILE para mejor legibidad del texto. SQL Server no requiere una sentencia END para cerrar el bucle. Otra diferencia es que MySQL usa la palabra reservada DO para indicar las instrucciones que van dentro del bucle. Y Si deseamos ejecutar varias instrucciones dentro del WHILE en SQL Server debemos crear un bloque de instrucciones.
Tienes ejemplos?Claro!, resolvamos el siguiente enunciado que requiere uso de un bucle WHILE:
Imprima en pantalla los números impares del 1 al 10

Veamos:

DECLARE @i INT = 0;WHILE @i <= 10   BEGIN;   IF (@i%2!=0)   PRINT @i                SET @i=@i+1;   END;
DECLARE i INT DEFAULT 0;WHILE i <= 10 DO   IF (i%2!=0) THEN   SELECT i;   END IF;      SET i=i+1;

END WHILE;

         SQL Server              MySQL


Aquí están los resultados:

Resulados en SQL Server 2008

Resulados en SQL Server 2008


Resultado XAMPP v3.2.1 - phpMyAdmin

Resultado XAMPP v3.2.1 - phpMyAdmin

Simplemente declaramos una variable llamada i que actúa como contador. Cada iteración el WHILE comprueba si el modulo entre 2 del número actual es distinto de 0, si es así se muestra el número, si no, no pasa nada.
Y que hago si quiero terminar el bucle antes?Existen comandos especiales en cada gestor de base de datos que nos permitirán terminar con fuerza un bucle o solo terminar una iteración sin ejecutar las sentencias restantes.
En el caso de SQL Server usaremos CONTINUE y BREAK. CONTINUE permitirá saltarse una iteración del bucle justo desde donde se ubicó, sin ejecutar ninguna instrucción de las que falta. BREAK en cambio, rompe el WHILE a la fuerza, terminando su ejecución y siguiendo con normalidad. Observa los siguientes ejemplos:

DECLARE @i INT = 0;WHILE @i <= 10   BEGIN;   SET @i=@i+1;   IF (@i%2!=0)   CONTINUE;          PRINT @i;END;
DECLARE @i INT = 0;WHILE @i <= 10   BEGIN;   IF (@i%2!=0)   PRINT @i;      IF @i=5   BREAK;      SET @i=@i+1;
END;

          CONTINUE                  BREAK


El código del lado derecho usa la sentencia CONTINUE para producir los números pares del 1 al 10. Si observas cada ves que hay un impar se salta la impresión y por ello no se tienen en cuenta los impares. En el segundo ejemplo se obtienen los impares solo hasta el número 5, ya que cerramos el bucle con BREAK de forma inmediata cuando la variable @i es igual a 5.
CONTINUE en SQL Server 2008BREAK en SQL Server 2008
MySQL tiene comandos equivalentes a CONTINUE y BREAK. Ellos son ITERATE y LEAVE. Ambas sentencias deben usarse con una etiqueta del WHILE para poder funcionar. Reconstruyamos los ejemplos anteriores y comprobemos estas dos sentencias:

DECLARE i INT DEFAULT 0;bucle1: WHILE i <= 10 DO   SET i=i+1;   IF (i%2!=0) THEN   ITERATE bucle1;   END IF;      SELECT i AS 'Numero par';        END WHILE bucle1;
DECLARE i INT DEFAULT 0;bucle1:WHILE i <=10 DO      IF (i%2!=0) THEN   SELECT i AS 'Numero impar';   END IF;       IF I=5 THEN     LEAVE bucle1;   END IF;      SET i=i+1;  
END WHILE bucle1;

                   ITERATE                                  LEAVE


Al ejecutar estos ejemplos dentro de un procedimiento cualquiera de MySQL, obtendremos los mismos resultados que en SQL Server:
ITERATE XAMPP v3.2.1 - phpMyAdminLEAVE XAMPP v3.2.1 - phpMyAdmin
James Revelo Urrea - Desarrollador independiente

Volver a la Portada de Logo Paperblog