Está en la página 1de 6

Base de Datos II

Ingeniera de Sistemas

Sesin 12
Constructores de Control de Flujo

Ing. Victor Hugo Tapia Jacinto

Pag. 139

Base de Datos II

Ingeniera de Sistemas

CONTROL DE FLUJO CON PROCEDIMIENTOS ALMACENADOS

Seguimos con los procedimientos almacenados. Vamos a ver cmo llevar a cabo el control de flujo
de nuestro procedimiento. Tambin es interesante observar el uso de las variables dentro de los
procedimientos. Si se declara una variable dentro de un procedimiento mediante el cdigo:
DECLARE miVar TIPO DE DATO;

Esta tendr un mbito local y cuando se acabe el procedimiento no podr ser accedida. Una vez la
variable es declarada, para cambiar su valor usaremos la sentencia SET de este modo:
SET miVar = Valor;

Para poder acceder a una variable a la finalizacin de un procedimiento se tiene que usar
parmetros de salida.

Vamos a ver unos ejemplos para comprobar lo sencillo que es :

IF THEN ELSE
Ejemplo 1: Crear un procedimiento almacenado que realice el mantenimiento de la Tabla
devoluciones (Insertar y Actualizar)

Ing. Victor Hugo Tapia Jacinto

Pag. 140

Base de Datos II

Ingeniera de Sistemas

CASE WHEN THEN


CASE es la expresin escalar especial en el lenguaje SQL. La Expresin CASE se utiliza
ampliamente para facilitar la determinacin / estableciendo un nuevo valor a partir de los valores
de entrada del usuario. La Expresin CASE se puede utilizar para diversos fines que depende de la
lgica de negocio.
La Expresin CASE se utiliza sobre todo en el procedimiento almacenado de SQL o como una
frmula para una columna en particular, que optimiza las sentencias SQL.
Expresin CASE de SQL se utiliza como un tipo de instruccin IF -THEN -ELSE. Es similar a
cambiar la declaracin en lenguajes de programacin recientes como C # y Java. La sintaxis de la
instruccin CASE es simple de la siguiente manera:
CASE column_name
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE result
END

Ejemplo 1: Crear un procedimiento almacenado que realice el mantenimiento de la misma Tabla


devoluciones (Insertar, Actualizar y Eliminar)

Creo que no hacen falta explicaciones.

Ing. Victor Hugo Tapia Jacinto

Pag. 141

Base de Datos II

Ingeniera de Sistemas

USO DE WHILE
La sentencia WHILE de SQL ejecuta un conjunto de instrucciones varias veces, mientras la
condicin por la cual se rige sea verdadera. Si en algn momento es falsa el bucle se termina
Para implementarla, primero debes tener en cuenta cual es la condicin que deseas que sea
verdadera y luego establecer que instrucciones son las que quieres ejecutar en cada iteracin.
Recuerda que una iteracin es un recorrido del ciclo desde el inicio hasta el final. Las sintaxis del
WHILE varan entre motores. A continuacin te muestro las de MySQL y SQL Server:

WHILE <condicin>
instruciones

[etiqueta:] WHILE <condicin> DO


instruciones
END WHILE [etiqueta]

MS 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.
DECLARE @i INT = 0;
WHILE @i <= 10
BEGIN;
IF (@i%2!=0)

DECLARE i INT DEFAULT 0;


WHILE i <= 10 DO
IF (i%2!=0) THEN
SELECT i;
END IF;
SET i=i+1;

PRINT @i
END WHILE;
SET @i=@i+1;
END;
MS SQL Server

MySQL

Y que hago si quiero terminar el bucle antes?


Existen comandos especiales en cada gestor de base de datos que nos permitirn terminar con
fuerza un bucle o solo terminar una iteracin sin ejecutar las sentencias restantes.
En el caso de SQL Server usaremos CONTINUE y BREAK. CONTINUE permitir saltarse una
iteracin del bucle justo desde donde se ubic, sin ejecutar ninguna instruccin de las que falta.
BREAK en cambio, rompe el WHILE a la fuerza, terminando su ejecucin y siguiendo con
normalidad. Observa los siguientes ejemplos:

Ing. Victor Hugo Tapia Jacinto

Pag. 142

Base de Datos II

Ingeniera de Sistemas

MS SQL Server
CONTINUE DECLARE @i INT = 0;
WHILE @i <= 10
BEGIN;
SET @i=@i+1;
IF (@i%2!=0)
CONTINUE;
PRINT @i;

BREAK

MySQL
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;
DECLARE @i INT = 0;

END WHILE bucle1;


DECLARE i INT DEFAULT 0;

WHILE @i <= 10

bucle1:WHILE i <=
10 DO

BEGIN;
IF (i%2!=0) THEN
IF (@i%2!=0)
SELECT i AS Nmero impar';
PRINT @i;
END IF;
IF @i=5
BREAK;
SET @i=@i+1;
END;

IF I=5 THEN
LEAVE bucle1;
END IF;
SET i=i+1;
END WHILE bucle1;

El cdigo del lado Izquierdo del SQL Server usa la sentencia CONTINUE para producir los
nmeros pares del 1 al 10. Si observas cada vez que hay un impar se salta la impresin y por ello
no se tienen en cuenta los impares. En el segundo ejemplo del SQL Server se obtienen los impares
solo hasta el nmero 5, ya que cerramos el bucle con BREAK de forma inmediata cuando la
variable @i es igual a 5.
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. Al ejecutar
estos ejemplos dentro de un procedimiento cualquiera de MySQL, obtendremos los mismos
resultados que en SQL Server.

Ing. Victor Hugo Tapia Jacinto

Pag. 143

Base de Datos II

Ingeniera de Sistemas

Tambin podemos utilizar el bucle WHILE conjuntamente con subconsultas.


DECLARE @coRecibo int
WHILE EXISTS (SELECT *
FROM RECIBOS
WHERE PENDIENTE = 'S')-- Ojo, la subconsulta se ejecuta
-- una vez por cada iteracion
-- del bucle!
BEGIN
SET @coRecibo = (SELECT TOP 1 CO_RECIBO
FROM RECIBOS WHERE PENDIENTE = 'S')
UPDATE RECIBOS
SET PENDIENTE = 'N'
WHERE CO_RECIBO = @coRecibo
END

Estructura GOTO

La sentencia GOTO nos permite desviar el flujo de ejecucin hacia una etiqueta. Fu muy
utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema
@@ERROR para el control de errores.
Actualmente, se desaconseja el uso GOTO, recomendndose el uso de TRY - CATCH para la
gestin de errores.

Ing. Victor Hugo Tapia Jacinto

Pag. 144

También podría gustarte