Вы находитесь на странице: 1из 9

Ejemplo de un Procedimiento Almacenado (Store Procedure)

TRANSACT SQL es el lenguaje de base de datos que utiliza Microsoft SQL Server 2008. Se trata de un superconjunto del lenguaje estndar definido por la American National Standards Institute (ANSI) y la International Standards Organization (ISO). Incluye las siguientes categoras de sentencias: DQL (Data Query Language/Lenguaje de consulta de datos): Utilizadas para obtener datos de base de datos. El ejemplo esencial es SELECT. DDL (Data Definition Language / Lenguaje de Definicin de Datos): Utilizadas para crear, alternar o borrar objetos de base de datos, tales como esquemas, tablas, columnas, vistas y secuencias. Como ejemplos tenemos las instrucciones CREATE, ALTER y DROP. DML (Data Modification Language / Lenguaje de Modificacin de Datos): Utilizadas en la interrogacin y manipulacin de datos en esquemas ya existentes. Los ejemplos caractersticos son los comandos INSERT, UPDATE y DELETE. TCL (Transaction Control Language / Lenguaje de Control de Transacciones), se utilizan para confirmar o restaurar transacciones de base de datos, que son unidades de trabajo que realizan una o ms sentencias SQL relacionadas entre s. Como ejemplos tenemos los comandos COMMIT y ROLLBACK. DCL (Data Control Language / Lenguaje de Control de Datos) utilizadas en el control de acceso a datos en la base de datos. Como los comandos GRANT y REVOKE. CCL (Cursor Control Lenguaje / Lenguaje de Control de Cursores), utilizadas para operar sobre filas individuales de una tabla resultado que consta de carios registros. Como ejemplos caracteristicos tenemos los comandos DECLARE CURSOR, FETCH INTO y UPDATE WHERE CURRENT.

Un procedimiento almacenado es un grupo de instrucciones TRANSACT SQL que se compila una vez, se almacena en el servidor y se ejecuta varias veces. Los procedimientos almacenados son un mtodo para encapsular tareas repetitivas. Admiten variables declaradas por el usuario y la ejecucin condicional. SINTAXIS CREATE PROCEDURE <Procedure_Name, sysname, Procedure_Name> <@param1, sysname, @p1> <datatype_for_param1, , int> = <default_value_for_param1, , 0>, <@param2, sysname, @p2> <datatype_for_param2, , int> = <default_value_for_param2, , 0> AS <Instrucciones T-SQL (Insert, Select, Update, Delete, ETC)> GO

EJEMPLO I A partir de una sentencia SQL (Select, Insert, Update, Delete, Etc) consulta y posteriormente elaborar su procedimiento almacenado. parametrizar la

Pasos Previos. 1. Crear la BD Prueba_SP

2. Crear la tabla Producto con los siguientes campos:

Nombre del Campo Id_producto nombre precio descripcin fecha

Tipo de Dato int nvarchar(100) smallmoney nvarchar(750) date

Paso 1. Sentencia SQL a ejecutar. Crear una nueva consulta y escribir la sentencia a ejecutar: USE Prueba_SP; GO INSERT INTO dbo.Producto (id_producto,nombre, precio, descripcion, fecha) VALUES(1001,'Whisky', 275.50,'12 Aos de aejamiento, promocin 2x1',GETDATE()); GO SELECT TOP 1 * FROM dbo.Producto ORDER BY id_Producto DESC; GO

Paso 2. Parametrizar la Sentencia SQL. Por cada uno de los campos que se requieren al insertar (para el caso de este ejemplo), deben de convertirse en variables T-SQL con el tipo de dato correspondiente, asignarles el valor del campo a Insertar y sustituirlos en la sentencia SQL. USE Prueba_SP; GO

Creacin de una variable local DECLARE @id int, @producto varchar(100), @precio smallmoney, @descripcion varchar(750);
SET SET SET SET @id = 1002; @producto = 'Agua mineral'; @precio = 12.50; @descripcion = 'Agua mineral de 2 litros';

INSERT INTO dbo.Producto( id_producto,nombre, precio, descripcion, fecha) VALUES(@id, @producto, @precio,@descripcion,GETDATE()); GO SELECT TOP 2 * FROM dbo.PRODUCTO ORDER BY id_producto DESC; GO Paso 3. Convertir el Bacth T-SQL a Procedimiento almacenado. Ya que tenemos la sentencia parametrizada, el paso final es convertirla en procedimiento almacenado, para esto tenemos que agregar la estructura de un STORE PROCEDURE SP de SQL Server 2008 como lo muestra el siguiente ejemplo:

CREATE PROCEDURE <Procedure_Name, sysname, Procedure_Name> <@param1, sysname, @p1> <datatype_for_param1, , int> = <default_value_for_param1, , 0>, <@param2, sysname, @p2> <datatype_for_param2, , int> = <default_value_for_param2, , 0> AS <Instrucciones T-SQL (Insert, Select, Update, Delete, ETC)> GO La primera parte es asignarle un nombre al SP. La Segunda parte es crear los parmetros que recibir el SP. Como tercera parte es crear el Batch de T-SQL que se ejecutara al llamar a nuestro SP. Ejemplo: CREATE PROCEDURE InsertaProductoSP @id int, @producto varchar(100),

Nombre del SP

Parmetros

@precio smallmoney, @descripcion varchar(750) AS INSERT INTO dbo.Producto(id_producto,nombre, precio, descripcion, fecha) VALUES(@id, @producto, @precio,@descripcion,GETDATE()); GO Paso 4. Ejecutar el Procedimiento almacenado. (EXECUTE / EXEC) USE Prueba_SP; GO EXEC InsertaProductoSP 41003,'Hielos', 12.90, 'Bolsa de hielos de 3 kilos'; GO SELECT TOP 3 * FROM dbo.Producto ORDER BY id_producto DESC; GO

Instrucciones T-SQL a ejecutar

EJEMPLO II Realizar un procedimiento almacenado que reciba los datos necesarios para insertarlos en la tabla, para garantizar la ejecucin correcta de las inserciones utilizar las transacciones Transact SQL y para validar la reversin de la transaccin en caso de que ocurra un ERROR utilizar el control de Errores Try Catch con RollBack. Nota: Una transaccin es un conjunto de operaciones T-SQL que funcionan como un solo bloque de instrucciones, esto significa que si ocurre un fallo durante la ejecucin de alguna instruccin del bloque todas las dems fallaran, lo que implica que nada ms se ejecutara y la transaccin tendr que deshacer todo lo que haba ejecutado hasta donde ocurri el fallo, a eso se la llama reversin de la transaccin y se ejecuta con un ROLLBACK, en caso de una ejecucin correcta se tendr que grabar la transaccin con COMMIT, el objetivo de las transacciones es garantizar que los datos que se inserten, actualicen o eliminen queden CONSISTENTES en la base de datos.

La estructura del SP es: CREATE PROCEDURE nombreProdedimiento -- Parmetros del SP @Param1 AS Varchar(25), @Param2 AS Bigint

. . . AS BEGIN -- Insertar bloque de instrucciones a ejecutar. /* SELECT UPDATE INSERT DELETE etc.... */ END GO La estructura del control de errores TRY-CATCH es: Begin Try /*Bloque de instrucciones a validar. -------------------------------------------------------------------------------------------------------------------------*/ End Try Begin Catch /*Bloque de instrucciones que se ejecutan si ocurre un ERROR. -------------------------------------------------------------------------------------------------------------------------*/ End Catch La estructura de una Transaccin es: Begin Tran NombreTransaccion--Inicio de la transaccin con su nombre Tadd o el que se elija. /*Bloque de instrucciones a ejecutar en la Transaccin -----------------------------------------------------------------------------*/ Commit Tran NombreTransaccion--Confirmacin de la transaccin. Rollback Tran NombreTransaccion--Reversin de la transaccin.

Pasos 1. Crear la tabla Vendedores y Jerarquia_Ven en la base de datos Prueba_SP con los siguientes campos: Vendedores Nombre del Campo Id_vendedor nombre apellidos email pass fecha_add Jerarquia_Vend Nombre del Campo id_jerarquia id_vendedor Tipo de Dato bigint int Tipo de Dato int varchar(50) varchar(50) varchar(30) varchar(20) Date

2. Generar el procedimiento considerando las estructuras definidas arriba CREATE PROCEDURE spAgregaVendedor @id int, @nom AS VARCHAR(50), @ape AS VARCHAR(50), @ema AS VARCHAR(30), @pas AS VARCHAR(20), @idJer AS BIGINT, @msg AS VARCHAR(100) OUTPUT AS BEGIN SET NOCOUNT ON; Begin Tran Tadd Begin Try INSERT INTO dbo.Vendedores(id_vendedor,nombre, apellidos, email, pass, fecha_add) VALUES (@id, @nom, @ape, @ema, @pas, GETDATE()) INSERT INTO dbo.Jerarquia_Vend (id_vendedor, id_jerarquia) VALUES (@id, @idJer) SET @msg = 'El Vendedor se registro correctamente.' COMMIT TRAN Tadd

End try Begin Catch SET @msg = 'Ocurrio un Error: ' + ERROR_MESSAGE() + ' en la lnea ' + CONVERT(NVARCHAR(255), ERROR_LINE() ) + '.' Rollback TRAN Tadd End Catch END GO Explicacin del procedimiento: 1. El Procedimiento recibe los datos a travs de parmetros de los cuales uno es de salida OutPut , que servir para indicar si la Insercin se realizo correctamente o no. 2. Crea una transaccin llamada Tadd, valida con TRY-CATCH las inserciones a las tablas Vendedores y Jerarquia_Vend. 3. Si las operaciones de insercin se ejecutan correctamente las confirma con COMMIT TRAN Tadd y regresa la variable @msg con un valor de confirmacin correcto, si ocurre un error se revierte la transaccin con ROLLBACK TRAN Tadd y devuelve en @msg un valor de error.

3. Ejecutar el procedimiento DECLARE @msg AS VARCHAR(100); EXEC spAgregaVendedor_2 741,'Hector','Garcia Garcia','atorresg@mail.com','a220109',4,@msg OUTPUT SELECT @msg AS msg Mensaje de insercin correcta:

Mensaje de Error en la Transaccin:

EJEMPLO III Considerando las Bases de Datos Empleados crear un procedimiento almacenado que muestre los vendedores que han aceptado un pedido que supone ms del 10% de su cuota. CREATE PROCEDURE Vendedores as select nombre from REPVENTAS where (.1 * CUOTA)< any (select importe from pedidos where REP=NUM_EMPL); GO

EXEC Vendedores Eliminar procedimientos almacenados Se puede usar el comando DROP PROCEDURE, o su versin abreviada DROP PROC, para eliminar un procedimiento almacenado definido por el usuario, varios procedimientos a la vez o un conjunto de procedimientos agrupados. El comando siguiente borra dos procedimientos en la base de datos Prueba_SP: InsertaProductoSP y spAgregaVendedor

USE Prueba_SP; GO DROP PROCEDURE InsertaProductoSP, spAgregaVendedor

EJERCICIOS Considerando las Bases de Datos Empleados y Estudiantes crear los siguientes procedimientos: 1. Crear un procedimiento almacenado que muestre los clientes asignados a Sue Smith que no han remitido un pedido superior a 3000. Consulta: Select empresa from clientes where rep_clie=(select num_empl from repventas where nombre=Sue Smith) and not exists (select *from pedidos where clie=num_clie and importe > 30000) 2. Generalizar el procedimiento anterior de tal forma que pueda mostrar los clientes asignados a cualquier vendedor que no haya remitido un pedido de cualquier importe. 3. Crear un procedimiento que permita insertar datos a las tablas Pedidos, Repventas y Oficinas.

4. Crear un procedimiento que visualice los cursos ofrecidos por el departamento de Filosofa y la tarifa total para sus cursos. Consulta: Select count (*) as [cursos], sum (ctarifa) as [tarifa total] from curso where cdept=PHIL 5. Generalizar el procedimiento anterior de tal forma que visualice los cursos ofrecidos por cualquier departamento.

Вам также может понравиться