120 likes | 260 Views
DuocUC. SQL SERVER APLICADO (SSA010). Ariel Alexis Fierro Sáez afierrosaez@gmail.com. Manejo de errores. Al igual que los lenguaje de programación transactSQL también provee los mecanismos necesarios para el control de errores.
E N D
DuocUC SQL SERVER APLICADO (SSA010) Ariel Alexis Fierro Sáez afierrosaez@gmail.com
Manejo de errores • Al igual que los lenguaje de programación transactSQL también provee los mecanismos necesarios para el control de errores. • TRY….CATCH permite un grupo de instrucciones transactSQL en el bloque TRY. Si de produce un error en este bloque, el control se transfiere a otro grupo de instrucciones que esta incluido en un bloque CATCH • BEGIN TRY • sql_statement • ….. • END TRY • BEGIN CATCH • sql_statement • ….. • END CATCH
Manejo de errores • En el ámbito de un bloque CATCH, se pueden utilizar las siguientes funciones del sistema para obtener información acerca del error que provocó la ejecución del bloque CATCH: • ERROR_NUMBER() devuelve el número del error. • ERROR_SEVERITY() devuelve la gravedad. • ERROR_STATE() devuelve el número de estado del error. • ERROR_PROCEDURE() devuelve el nombre del procedimiento almacenado o desencadenador donde se produjo el error. • ERROR_LINE() devuelve el número de línea de la rutina que provocó el error. • ERROR_MESSAGE() devuelve el texto completo del mensaje de error. Este texto incluye los valores suministrados para los parámetros remplazables, como longitudes, nombres de objetos u horas. NOTA: Estas funciones devuelven NULL si se las llama desde fuera del ámbito del bloque CATCH
Manejo de errores • Un bloque CATCH puede contener una construcción TRY…CATCH incrustada para controlar los errores detectados por el código de CATCH. • BEGIN TRY • <sql_statement1> • …. • END TRY • BEGIN CATCH • <sql_statement2> • ….. • BEGIN TRY • <sql_statement3> • ….. • END TRY • BEGIN CATCH • <sql_statement4> • ….. • END CATCH • END CATCH
Manejo de errores • En los bloques CATCH anidados, cualquier TIPO DEERROR devuelve el error específico para el ámbito del bloque CATCH donde se hace referencia a él. • BEGIN TRY //try…catch externo • <sql_statement1> • …. • END TRY • BEGIN CATCH • PRINT ERROR_MESSAGE() // referencia al error producido en TRY externo • ….. • BEGIN TRY // try…catch interno • PRINT ERROR_MESSAGE() // referencia al error producido en TRY externo • <sql_statement3> • ….. • END TRY • BEGIN CATCH • PRINT ERROR_MESASAGE() //referencia al error producido en TRY interno • ….. • END CATCH • END CATCH
Manejo de errores • Muchas veces es necesario provocar voluntariamente un error, por ejemplo nos puede interesas que se genere un error cuando los datos incumplen una regla de negocio. • RAISERRORgenera un error voluntario e inicia el procesamiento de errores de la sesión. • RAISERROR (<mensaje_error>, <severidad_error>,<estado_error>) • Condiciones • Dentro de un bloque TRY • Severidad del error entre 0 y 18. Los error de 19 a 25 se consideran errores fatales de sistema, solo los usuarios del grupo sysadmin pueden asignar dichos valores • Error con estados entre 1 a 127.
Manejo de errores • Ejemplo RAISERROR: DECLARE@nombre varchar(20), @edad intSET@nombre = ‘Jose’SET@edad= 10 IF(@edad>0 AND@edad< 18)BEGIN RAISERROR (‘Solo pueden ingresar mayor a 18 años’', 16, -- Severidad 1 -- Estado )END
Procedimiento almacenado • Un procedimiento almacenado (storedprocedure) es un programa que se encuentra almacenado físicamente en la base de datos para ser utilizado en cualquier momento. Algunas de sus características son: • Aceptan parámetro de entrada • Pueden devolver un valor o un conjunto de valores • Contienen instrucciones que realizan operaciones sobre la base de datos • Son ejecutadas del lado del servidor de base de datos.
Procedimiento almacenado • Creación de procedimiento almacenado, sin parámetro salida. CREATE PROCEDURE <nombre_procedimiento> [@param1 <tipo>, ………] AS BEGIN sql_statement ……. END • Creación de procedimiento almacenado, con parámetro salida. CREATE PROCEDURE <nombre_procedimiento> [@param1 <tipo>, ….., @variable <tipo> OUTPUT] AS BEGIN sql_statement ……. END
Procedimiento almacenado • Modificación de un procedimiento almacenado ALTER PROCEDURE <nombre_procedimiento> [@param1 <tipo>, ………] AS BEGIN sql_statement ……. END • Eliminación de un procedimiento almacenado DROP PROCEDURE <nombre_procedimiento> • Ejecución de un procedimiento almacenado EXEC <nombre_procedimiento> [<param1>, <param2>,…….. , [@variable <tipo> OUTPUT] ]
Ejercicios • Crear un procedimiento almacenado que permita calcular el porcentaje de producto cargados un determinado equipo, es decir, de t0dos los cartones que son de responsabilidad de carga de un equipo, cuanto de ellos se encuentran cargados en algún camión. Considere que estado 40 corresponde que un cartón se encuentra ya cargado en el camión. • Defina un script que liste todos los equipos indicando el porcentaje de carga de los cartones asignados, en caso de no tener carga de trabajo el equipo indicarlo. • Usando la base de datos Agenda. Crear un procedimiento almacenado que permita realizar un despido de una persona, además el programa deberá entregar como resultado la cantidad de dinero que se le pagara por los años de servicios. Considere que el calculo de la indemnización será la suma de la gratificación y el sueldo base de todos los contratos que pueda tener el empleado, además se deberá considerar la fecha de contrato mas antigua para determinar los años de antigüedad.
Referencias • TRY...CATCH (Transact-SQL) http://msdn.microsoft.com/es-es/library/ms175976.aspx • Procedimientos almacenados (motor de base de datos) http://msdn.microsoft.com/es-es/library/ms190782.aspx