Kategorier: Alle - bucle - while - errores - sql

af Ely Micky 4 år siden

257

Estructuras de control SQL

Estructuras de control SQL

Estructuras de control SQL

Estructura GOTO

EJEMPLO ESTRUCTURA GOTO
DECLARE @divisor int, @dividendo int, @resultado int SET @dividendo = 100 SET @divisor = 0 SET @resultado = @dividendo/@divisor IF @@ERROR > 0 GOTO error PRINT 'No hay error' RETURN error: PRINT 'Se ha producido una division por cero'

Control de errores en SQL

Uso de TRY CATCH


    A partIr de la versión 2005, SQL Server proporciona el control de errores a través de las instrucciónes TRY y CATCH.

   Estas nuevas instrucciones suponen un gran paso adelante en el control de errores en SQL Server, un tanto precario en las versiones anteriores.


El siguiente ejemplo ilustra el uso de TRY - CATCH.


BEGIN TRY

     DECLARE @divisor int , 

     	     @dividendo int, 

             @resultado int
 

     SET @dividendo = 100

     SET @divisor = 0

     -- Esta linea provoca un error de division por 0
     SET @resultado = @dividendo/@divisor
     PRINT 'No hay error'
 END TRY
 BEGIN CATCH
     PRINT 'Se ha producido un error'
 END CATCH 


Actualmente, se desaconseja el uso GOTO, recomendandose el uso de TRY - CATCH para la gestion de errores.
La sentencia goto nos permite desviar el flujo de ejecución hacia una etiqueta. Fué muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema @@ERROR para el control de errores.

Estructura condicional CASE

CASE permite subconsultas.
DECLARE @Web varchar(100), @diminutivo varchar(3) SET @diminutivo = 'DJK' SET @Web = (CASE WHEN @diminutivo = 'DJK' THEN (SELECT web FROM WEBS WHERE id=1) WHEN @diminutivo = 'ALM' THEN (SELECT web FROM WEBS WHERE id=2) ELSE 'www.devjoker.com' END) PRINT @Web
Presentamos un Ejemplo de CASE.
DECLARE @Web varchar(100), @diminutivo varchar(3) SET @diminutivo = 'DJK' SET @Web = (CASE @diminutivo WHEN 'DJK' THEN 'www.devjoker.com' WHEN 'ALM' THEN 'www.aleamedia.com' ELSE 'www.devjoker.com' END) PRINT @Web
La estructura condicional CASE permite evaluar una expresion y devolver un valor u otro.

Bucle WHILE

WHILE con las subconsultas.
DECLARE @coRecibo int WHILE EXISTS (SELECT * FROM RECIBOS WHERE PENDIENTE = 'S') BEGIN SET @coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = 'S') UPDATE RECIBOS SET PENDIENTE = 'N' WHERE CO_RECIBO = @coRecibo END
Con la instrucción BREAK.
DECLARE @contador int SET @contador = 0 WHILE (1 = 1) BEGIN SET @contador = @contador + 1 IF (@contador % 50 = 0) BREAK PRINT 'Iteracion del bucle ' + cast(@contador AS varchar) END
Un ejemplo del bucle WHILE.
DECLARE @contador int SET @contador = 0 WHILE (@contador < 100) BEGIN SET @contador = @contador + 1 IF (@contador % 2 = 0) CONTINUE PRINT 'Iteracion del bucle ' + cast(@contador AS varchar) END
El bucle WHILE se repite mientras expresion se evalue como verdadero. Es el único tipo de bucle del que dispone SQL.

Estructura condicional IF

El IF admite el uso de subconsultas:
DECLARE @coPais int, @descripcion varchar(255) set @coPais = 5 set @descripcion = 'España' IF EXISTS(SELECT * FROM PAISES WHERE CO_PAIS = @coPais) BEGIN UPDATE PAISES SET DESCRIPCION = @descripcion WHERE CO_PAIS = @coPais END ELSE BEGIN INSERT INTO PAISES (CO_PAIS, DESCRIPCION) VALUES (@coPais, @descripcion) END
Ejemplo de la estructura condicional IF.
DECLARE @Web varchar(100), @diminutivo varchar(3) SET @diminutivo = 'DJK' IF @diminutivo = 'DJK' BEGIN PRINT 'www.devjoker.com' END ELSE BEGIN PRINT 'Otra Web (peor!)' END
La estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO), y ejecutar las operaciones contenidas en el bloque formado por BEGIN END.