presentacion - base de datos ii - tratamiento de errores

Upload: cristian-pinzon

Post on 24-Feb-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    1/27

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    2/27

    Manejo de Errores con Begin Try/End Try Begin

    Catch/End Catch

    Uso de la variable @@Error

    Lanzar Errores con la instruccin Raiserror

    CONTENIDO

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    3/27

    TRATAMIENTO DE ERORES

    SQL Server proporciona el control de errores a

    travs de las instrucciones TRY y CATCH.

    Estas nuevas instrucciones suponen un gran pasoadelante en el control de errores en SQL Server.

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    4/27

    TRATAMIENTO DE ERORES

    Begin try

    Expresion_sql

    End try

    Begin catch

    Expresion_sql

    End catch

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    5/27

    TRATAMIENTO DE ERORES

    Funciones especiales de Error

    Las funciones especiales de error, estn disponibles

    nicamente en el bloque CATCH para la obtencin de

    informacin detallada del error.

    A continuacin, presentamos las funciones que se utilizan

    en el control de errores.

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    6/27

    TRATAMIENTO DE ERORES

    Funciones especiales de Error

    ERROR_NUMBER(): Devuelve el numero de error

    ERROR_SEVERITY(): Devuelve la severidad del error

    ERROR_STATE(): Devuelve el estado del error ERROR_PROCEDURE(): Devuelve el nombre del

    procedimiento almacenado que ha provocado el error

    ERROR_LINE(): Devuelve el nmero de lnea en la que

    se ha producido el error. ERROR_MESSAGE(): Devuelve el mensaje de error

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    7/27

    TRATAMIENTO DE ERORES

    Errores no afectados por una construccinTRYCATCHLas construcciones TRYCATCH no detectan lo siguiente:

    o

    Advertencias o mensajes informativos que tienen unagravedad 10 o inferior.

    o Errores que tienen la gravedad 20 o superior que

    detienen el procesamiento de las tareas de Motor de

    base de datos de SQL Server en la sesin. Si se produce

    un error con una gravedad 20 o superior y no seinterrumpe la conexin con la base de datos,

    TRYCATCH controlar el error.

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    8/27

    TRATAMIENTO DE ERORES

    Errores no afectados por una construccin TRYCATCH

    Las construcciones TRYCATCH no detectan lo siguiente:

    o Atenciones, como solicitudes de interrupcin de clientes

    o conexiones de cliente interrumpidas.o Cuando el administrador del sistema finaliza la sesin

    mediante la instruccin KILL.

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    9/27

    TRATAMIENTO DE ERORES

    Errores no afectados por una construccin TRYCATCH

    Un bloque CATCH no controla los siguientes tipos de

    errores cuando se producen en el mismo nivel de ejecucin

    que la construccin TRYCATCH:

    Errores de compilacin, como errores de sintaxis, que

    impiden la ejecucin de un lote.

    Errores que se producen durante la recompilacin deinstrucciones, como errores de resolucin de nombres de

    objeto que se producen despus de la compilacin

    debido a una resolucin de nombres diferida.

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    10/27

    PROBLEMAS PRCTICOS

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    11/27

    --Problema N1--sin capturar el error Qu sucede?

    DECLARE @DIVISORINT,@DIVIDENDOINT,

    @RESULTADOINT

    SET@DIVIDENDO=5

    SET@DIVISOR=0

    -- ESTA LINEA PROVOCA UN ERROR DE DIVISION POR

    0

    SET@RESULTADO=@DIVIDENDO/@DIVISOR

    Manejo de Errores con TRYCATCH

    --Resultado de la EjecucinMens. 8134, Nivel 16, Estado 1, Lnea 6Error de divisin entre cero.

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    12/27

    Manejo de Errores con TRYCATCH

    --Resultado de la EjecucinSE HA PRODUCIDO UN ERROR

    --Ahora capturando el error con Begin Try/End Try - Begin Catch/EndCatch

    BEGINTRY

    DECLARE @DIVISORINT,@DIVIDENDOINT,@RESULTADOINT

    SET@DIVIDENDO=5

    SET@DIVISOR=0

    -- ESTA LINEA PROVOCA UN ERROR DE DIVISION POR 0

    SET@RESULTADO=@DIVIDENDO/@DIVISOR

    PRINT'NO HAY ERROR'

    ENDTRY

    BEGINCATCH

    PRINT'SE HA PRODUCIDO UN ERROR'ENDCATCH;

    GO

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    13/27

    Manejo de Errores con TRYCATCH

    --Resultado de la EjecucinErrorNumber ErrorSeverity ErrorState ErrorProcedure ErrorLine ErrorMessage

    8134 16 1 NULL 8 Error de divisin entre cero.

    BEGINTRY

    DECLARE @DIVISORINT,@DIVIDENDOINT,@RESULTADOINT

    SET@DIVIDENDO=100

    SET@DIVISOR=0

    -- ESTA LINEA PROVOCA UN ERROR DE DIVISION POR 0

    SET@RESULTADO=@DIVIDENDO/@DIVISOR

    PRINT'NO HAY ERROR'

    ENDTRY

    BEGINCATCH

    SELECT

    ERROR_NUMBER()ASErrorNumber

    ,ERROR_SEVERITY()ASErrorSeverity

    ,ERROR_STATE()ASErrorState

    ,ERROR_PROCEDURE()ASErrorProcedure

    ,ERROR_LINE()ASErrorLine

    ,ERROR_MESSAGE()ASErrorMessage;

    ENDCATCH

    GO

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    14/27

    Manejo de Errores con TRYCATCH

    --Resultado de la EjecucinError de divisin entre cero.

    1

    BEGINTRY

    DECLARE@DIVISORINT,@DIVIDENDOINT,@RESULTADOINTSET@DIVIDENDO=9

    SET@DIVISOR=0

    -- ESTA LINEA PROVOCA UN ERROR DE DIVISION POR 0

    SET@RESULTADO=@DIVIDENDO/@DIVISOR

    PRINT'NO HAY ERROR'

    ENDTRY

    BEGINCATCH

    PRINTERROR_MESSAGE()

    PRINTERROR_STATE()

    ENDCATCH;

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    15/27

    TRATAMIENTO DE ERORES

    Variable de sistema @@ERROR

    Devuelve el nmero de error de la ltima

    instruccin TRANSACT-SQL ejecutada; si lavariable devuelve 0, la TRANSACT-SQL anterior

    no encontr errores.

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    16/27

    TRATAMIENTO DE ERORES

    Variable de sistema @@ERROR

    La variable @@ERROR devuelve un nmero de error que

    representa el error de la operacin. Si el error se encuentra

    en la vista de catlogo sys.sysmessages, entonces@@ERROR, contendr el valor de la columna

    sys.sysmessages.error para dicho error. Puede ver el texto

    asociado con el nmero de error @@ERROR en

    sys.sysmessages.description

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    17/27

    Manejo de Errores con @@Error

    --Resultado de la EjecucinMens. 547, Nivel 16, Estado 0, Lnea 1

    Instruccin DELETE en conflicto con la restriccin REFERENCE

    "FK_TB_Producto_TB_Proveedor_Codigo_Proveedor". El conflicto ha aparecido en la base

    de datos "DB_EmpresaXYZ", tabla "dbo.TB_Producto", column 'Codigo_Proveedor'.

    Se termin la instruccin.

    No se puede eliminar el Proveedor indicado.

    --Qu sucede con el manejo del error?DELETEFROMTB_Proveedor

    IF@@ERROR0

    BEGIN

    PRINT'No se puede eliminar el Proveedor

    indicado.'

    END

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    18/27

    Manejo de Errores con @@Error

    --Resultado de la Ejecucin

    (0 filas afectadas)

    Proveedor con Registros enlazados.

    547

    BEGINTRY

    DELETEFROMTB_Proveedor

    ENDTRY

    BEGINCATCH

    declare@NERRORINT

    SET@NERROR=@@ERROR

    IF@NERROR=547

    BEGIN

    PRINT'Proveedor con Registros enlazados.'PRINT@NERROR

    END

    ENDCATCH

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    19/27

    Manejo de Errores con @@Error

    --Resultado de la Ejecucin(0 filas afectadas)

    Ya existe un registro de estudiantes con esos datos.

    2627

    USEBD_ACADEMICA

    GO

    SELECT*FROMTB_ESTUDIANTES

    BEGINTRY

    INSERTINTOTB_ESTUDIANTES(ID_Estudiante,Nombre_Estudiante,Apellido_Estudiante,

    Direccion_Estudiante,Telefono_Fijo_Estudiante,Telefono_Movil_Estudiante,

    Correo_Estudiante,Cod_Carrera)

    VALUES (9025,'Carlos','Perez','barbarena','993-1616','66302678',

    '[email protected]',1001)ENDTRY

    BEGINCATCH

    declare@NERRORINT

    SET@NERROR=@@ERROR

    IF@NERROR0

    BEGIN

    PRINT'Ya existe un registro de estudiantes con esos datos.'

    PRINT@NERROR

    END

    ENDCATCH

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    20/27

    Manejo de Errores con @@Error

    --Resultado de la Ejecucin(0 filas afectadas)

    Instruccin %1! en conflicto con la restriccin %2! "%3!". El conflicto ha aparecido en la base de

    datos "%4!", tabla "%5!"%6!%7!%8!.

    547

    USEDB_EmpresaXYZ

    GOBEGINTRY

    DELETEFROMTB_Producto--WHERE Cantidad_Inventario < 20

    ENDTRY

    BEGINCATCH

    DECLARE@MENSAJEVARCHAR(255)

    DECLARE@ErrorNumint

    --Recuperar la Descripcin del error

    SELECT@MENSAJE=M.description,@ErrorNum=M.error FROM

    SYS.sysmessagesM

    WHEREM.error=@@ERRORandmsglangid=3082

    PRINT@MENSAJE

    PRINT@ErrorNum

    ENDCATCH

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    21/27

    TRATAMIENTO DE ERORES

    Generar un error RAISERROREn ocasiones, es necesario provocar voluntariamente un

    error, por ejemplo nos puede interesar que se genere un

    error cuando los datos incumplen una regla de negocio.

    Podemos provocar un error en tiempo de ejecucin a travs

    de la funcin RAISERROR.

    La funcin RAISERROR recibe tres parmetros, el mensaje

    del error (o cdigo de error predefinido), la severidad y elestado.

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    22/27

    TRATAMIENTO DE ERORES

    Generar un error RAISERROR

    La severidad indica el grado de criticidad del error. Admite

    valores de 0 al 25, pero solo podemos asignar valores del 0

    al 18. Los errores el 20 al 25 son considerados fatales porel sistema, y cerraran la conexin que ejecuta el comando

    RAISERROR.

    Para asignar valores del 19 al 25, necesitaremos sermiembros de la funcin de SQL Server sysadmin.

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    23/27

    Lanzar Mensaje de Error con RAISERROR

    --Resultado de la EjecucinSin error en la ejecucin

    Mens. 50000, Nivel 3, Estado 1

    DECLARE@VALORINT

    SET@VALOR=16IF@VALOR=15

    BEGIN

    RAISERROR('Un problema ha ocurrido al intentar

    ejecutar la operacin

    realizada',16,1 )

    ENDELSE

    BEGIN

    RAISERROR('Sin error en la ejecucin',3,1 )

    END

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    24/27

    Lanzar Mensaje de Error con RAISERROR

    --Resultado de la EjecucinMens 50000, Nivel 16, Estado 1, Procedimiento PROC_RAISERROR_REGISTRO_ESTUDIANTE, Lnea 22

    Se requiere por lo menos el nombre y apellido del Estudiante

    USEBD_ACADEMICA

    GO

    CREATEPROCEDUREPROC_RAISERROR_REGISTRO_ESTUDIANTE

    @IdInt,@Nombrevarchar(20),

    @Apellidovarchar(20),

    @Direccionvarchar (20),

    @Telefonovarchar(10),

    @Movilvarchar(10),

    @Correovarchar(50),

    @Carreraint

    AS

    BEGIN

    IF (@Nombre''and@Apellido'')BEGIN

    INSERTINTOTB_ESTUDIANTES(ID_Estudiante,Nombre_Estudiante,Apellido_Estudiante,Direccion_Estudiante,

    Telefono_Fijo_Estudiante,Telefono_Movil_Estudiante,Correo_Estudiante,Cod_Carrera)

    VALUES(@Id,@Nombre,@Apellido,@Direccion,@Telefono,@Movil,@Correo,@Carrera)

    END

    ELSE

    BEGIN

    RAISERROR ('Se requiere por lo menos el nombre y apellido del Estudiante',16,1)

    ENDEND

    GO

    --LLamar procedimiento almacenado.

    EXECPROC_RAISERROR_REGISTRO_ESTUDIANTE9026,'','','barbarena','993-1616','66302678',

    '[email protected]',1001

    Go

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    25/27

    PROBLEMAS PROPUESTOS

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    26/27

    /*

    PROBLEMA PROPUESTO N1. Escribir el cdigo SQL que permitaverificar si existe el registro de un docente con los datos de

    entrada. Si el registro exste con el nombre y el apellido, se

    genere un error indicando que ya existe un registro del docente

    utilizando la instruccin RAISERROR

    */

    /*

    Escriba el cdigo SQL para lanzar una advertencia cuando para un

    curso especificado no hallan cupos disponibles segn una cantidad

    establecida. Cuando la cantidad es por debajo del umbral igual se

    indica con un mensaje que hay cupos disponible.*/

    PROBLEMAS PROPUESTOS

  • 7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores

    27/27

    FIN DE LA SESIN