You are on page 1of 7

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLOGICOS ESCUELA DE COMPUTACION

GUIA DE LABORATORIO N10 Nombre de la practica: Creacin de Procedimientos Almacenados y Disparadores Lugar de ejecucin: Laboratorio de Informtica Tiempo estimado: 3 horas Materia: Base de datos I Docentes: Ing. Ren Tejada (01L), Inga. Blanca Iris Caas (02L), Inga. Evelyn Hernndez (03L), Ing Carlos Alfaro (PILET Ricaldone), Ing. Yesenia Escobar (PILET CDB)

CICLO 01-2011

I. Objetivos Qu el estudiante: Cree procedimientos almacenados.

Utilizar los procedimientos almacenados para facilitar consultas en SQL Server


Utilice desencadenadores II. Introduccin Terica Transact-SQL no es realmente un lenguaje de programacin similar a las herramientas de tercera y cuarta generacin sin embargo permite utilizar SQL para realizar tareas complejas que requieren saltos, bucles, decisiones. Transact-SQL se utiliza a menudo en la creacin de procedimientos almacenados y triggers (desencadenadores) de tal forma que las aplicaciones clientes que se conectan a SQL Server solo se preocupan por la presentacin de los datos para el usuario final, mientras que la lgica de los procesos se maneja en el servidor. El control de flujo en Transact-SQL Construccin Descripcin IFELSE Define una decisin. GOTO etiqueta Define un salto incondicional WAITFOR Establece un tiempo para la ejecucin de una instruccin. El tiempo puede ser un intervalo de retardo o un instante especificado de ejecucin (una hora concreta del da) WHILE Bucle bsico de SQL BREAK Acompaa al bucle WHILE y le indica finalizarlo inmediatamente. CONTINUE Acompaa al bucle WHILE y le indica continuar con la siguiente iteracin. RETURN [n] Salida incondicional del procedimiento o proceso por lotes, se puede definir un nmero entero como estado devuelto y puede asignarse a cualquier variable. BEGIN...END Utilizado en conjunto con IF..ELSE o WHILE para agrupar un conjunto de instrucciones. CASE Implementada en la instruccin SELECT y UPDATE y permite realizar consultas y actualizaciones condicionales. PRINT Es una instruccin para imprimir un dato en la pantalla, la sintaxis es: PRINT "cadena"; cadena puede ser tambin una variable de tipo varchar. Por ejemplo: PRINT Hola a todos

Procedimientos Almacenados
Los procedimientos almacenados son conjuntos de sentencias en leguaje Transact SQL que pueden almacenarse en el propio servidor. Los procedimientos almacenados de SQL Server, son ms potentes, porque permiten almacenar funciones y procedimientos compuestos por varias instrucciones, introducir saltos, bucles, etc. 1

Creacin de procedimientos almacenados (Store Procedures) La instruccin general para crear procedimientos almacenados es la siguiente: CREATE PROC nombre_proc parametros AS INSTRUCCION SQL Es necesario aclarar, que un procedimiento almacenado puede recibir parmetros de entrada y devolver parmetros de salida. Por ejemplo, podemos crear un procedimiento para recuperar el nombre de un autor, cuyo cdigo se pasa por parmetro.
CREATE PROCEDURE ObtenerNombre @au_id varchar(11) AS SELECT author FROM title WHERE title.title_no = @au_id

Con esta sentencia, se crea un procedimiento almacenado, de nombre ObtenerNombre, al que se le pasa un parmetro, llamado @au_id, de tipo varchar, que realiza una consulta para obtener el nombre del autor de la tabla title, cuyo cdigo coincida con el parmetro. De esta forma, si queremos obtener el nombre del autor cuyo cdigo sea '50', deberemos ejecutar el procedimiento pasndole como argumento este valor. Las llamadas a procedimientos almacenados se pueden realizar de las siguientes formas: Pasando los argumentos en el mismo orden que en el que se han declarado. ObtenerNombre '50' Pasando los argumentos nombrados. En este caso no hace falta que los parmetros vayan en el mismo orden. ObtenerNombre @au_id = '45' Parmetros por referencia Si ejecutamos las anteriores sentencias, obtendremos el resultado directamente en la ventana que tengamos abierta en SQL Server. Pero qu pasa si queremos obtener un parmetro de salida, como resultado de la ejecucin del procedimiento?. La solucin para este caso es utilizar la palabra reservada OUTPUT para los argumentos de salida. Si por ejemplo, queremos obtener el nmero de ttulos que tenemos en la base de datos, crearemos el procedimiento almacenado que muestra a continuacin:
CREATE SELECT SELECT RETURN PROCEDURE num_titulos @titulos int OUTPUT AS * FROM title @titulos = @ROWCOUNT (0)

Vamos a estudiar el anterior ejemplo. Detrs de la palabra reservada PROCEDURE damos el nombre del procedimiento almacenado, y a continuacin proporcionamos los parmetros, junto con su tipo (que en este caso es entero), y diremos sin stos son de salida, en cuyo caso especificamos la palabra reservada OUTPUT a continuacin. Tras la palabra reservada AS se codifica el cuerpo del procedimiento. Primero contamos todas las filas de la tabla title, realizando un SELECT * FROM title. A continuacin devolvemos en el parmetro @titulos el valor obtenido, utilizando @@ROWCOUNT. Para ejecutar este procedimiento escribimos las siguientes sentencias:
DECLARE @titulos int EXEC num_titulos @titulos OUTPUT SELECT titulos = @titulos

Nos mostrar los registros de la tabla y al final el valor de la variable @titulos

Borrar Procedimientos Almacenados Si queremos borrar un procedimiento almacenado, ejecutaremos la sentencia DROP PROCEDURE, seguido del nombre del procedimiento. Por ejemplo, si queremos borrar el procedimiento almacenado, creado en el anterior ejemplo, escribiremos el Cdigo:
DROP PROCEDURE num_titulos

Desencadenadores (Triggers)
Los disparadores de procedimiento, ms comnmente conocidos como triggers, son una especie de procedimientos almacenados, a diferencia que se ejecutan cuando ocurre un evento sobre alguna tabla. Entendemos por evento, cualquier accin del tipo: Insercin Borrado Actualizacin La sintaxis de la sentencia de creacin de triggers es la siguiente: CREATE TRIGGER nombre ON tabla FOR [DELETE | INSERT | UPDATE] AS Sentencias Las palabras reservadas DELETE, INSERT y UPDATE corresponden a cada una de las acciones para las cuales se puede definir un desencadenador dentro de la tabla especificada. El bloque de sentencias permite prcticamente cualquier tipo de ellas dentro del lenguaje T-SQL, pero con ciertas limitaciones. Por ejemplo, no se podr utilizar la sentencia select, ya que un trigger no puede devolver datos al usuario, sino que simplemente se ejecuta para cambiar o comprobar los datos que se van a insertar, actualizar o borrar. Por ejemplo, si queremos crear un trigger llamado modificacin_cliente, sobre la tabla Customers, que muestre un mensaje cada vez que se actualiza una fila de la tabla, deberemos escribir el Cdigo:
CREATE TRIGGER modificacion_Clientes ON Customers FOR UPDATE AS print 'Han actualizado la tabla de Customers'

Para comprobar el funcionamiento de este trigger, podemos actualizar cualquier fila de la tabla de customers, por ejemplo con la sentencia:
Update Customers set ContactName='Maria Walters' where CustomerID='AROUT'

Con esto conseguimos dos cosas, actualizar el nombre del Cliente cuyo cdigo es el y obtener el mensaje que se muestra como ejecucin del trigger de actualizacin. Sin embargo, los triggers en SQL Server tienen una serie de limitaciones: 1. No se puede disparar un trigger dentro de otro trigger, ya que dara lugar a un bucle infinito 2. Por esta razn, un trigger no puede ejecutar instrucciones DDL (lenguaje de definicin de datos) 3. No se pueden ejecutar sentencias como SELECT INTO o de creacin de dispositivos dentro de un trigger Del mismo modo, para borrar un trigger, deberemos ejecutar la sentencia DROP TRIGGER trigger. Por ejemplo, si queremos borrar el trigger anteriormente creado, ejecutaremos
DROP TRIGGER modificacion_Clientes

Las tablas deleted e inserted Dentro de la definicin de un trigger, podemos hacer referencia a un par de tablas lgicas, cuya estructura es similar a la tabla donde se est ejecutando el trigger; es decir, es una copia de la tabla en la cual se van a insertar o borrar los datos, y que contiene, precisamente, los datos que van a ser aadidos o borrados. La utilidad de estas dos tablas es la de realizar comprobaciones entre los datos antiguos y los nuevos. As, por ejemplo, si queremos recuperar los datos de la tabla que estamos borrando, dentro del trigger, se deber ejecutar el siguiente cdigo:
SELECT * FROM deleted

Tipos de desencadenadores SQL-Server permite la definicin de varios tipos de triggers, entre los cuales cabe destacar los siguientes: Desencadenadores mltiples: para una misma tabla, se pueden definir distintos triggers para la misma accin, es decir, si definimos un trigger para insert, y resulta que dicha tabla ya tena definido un trigger para esa misma accin, se ejecutarn ambos triggers cuando ocurra dicho evento sobre la tabla. Desencadenadores recursivos: se permite la recursividad entre las llamadas a los triggers, es decir, un trigger puede llamar a su vez a otro, bien de forma directa, bien de forma indirecta. Desencadenadores anidados: si un trigger cambia una tabla en la que se encuentra definido otro trigger, se provoca la llamada de este ltimo que, si a su vez vuelve a modificar otra tabla, puede provocar la ejecucin de otro trigger, y as sucesivamente. Si se supera el nivel de anidamiento permitido, se cancelar la ejecucin de los triggers. Limitaciones de los triggers Aunque ya se han comentado algunas de las limitaciones a la hora de programar triggers, veamos en detalle las restricciones que implica la definicin de triggers: Un trigger slo se puede aplicar a una tabla Aunque un trigger se defina dentro una sola base de datos, puede hacer referencia a objetos que se encuentran fuera de la misma La misma accin del desencadenador puede utilizarse para definir ms de un trigger sobre la misma tabla. La opcin SET elegida dentro de la ejecucin de un desencadenador, volver a su estado previamente definido una vez concluya la ejecucin del mismo. As mismo, no se permite la utilizacin de las sentencias del DDL dentro de la definicin de un trigger. En una vista no se puede utilizar un desencadenador. III. Requerimientos Maquina virtual con Windows 2003 Server Disco de instalacin de SQL Server 2008 Gua Nmero 10

IV. Procedimiento

Parte 1: Iniciando sesion desde SQL Server Managment Studio 1. Hacer clic en el botn Inicio 2. Hacer clic en la opcin Todos los programas y hacer clic en Microsoft SQL Server 2008 R2 3. Cargue SQL Server 2008 R2. Para conectarse con el servidor de base de datos elija los siguientes parmetros de autenticacin: Tipo de servidor: Database Engine 4

Nombre del servidor: SALA02-PCNumMaquina Nota: NumMaquina es el numero de maquina local Autenticacin: SQL Server Authentication Login: sa Password: 123456 4. Luego de clic en el botn conectar y asi ingresar a la ventana del SQL Server Managment Studio. 5. Luego seleccionara del men estndar la opcin (Nueva Consulta/New Query) para empezar a trabajar con las sentencia de T-SQL. 6. Localice el icono de guardar, con el fin de guardar el nuevo archivo de sentencias T-SQL (SQLQuery1.sql). En el asistente para guardar archivo, cree una carpeta llamada Practica10_BDD en el escritorio (ah se ira guardando todos los scripts del procedimiento restante).

Parte 2: Ejemplos de Procedimientos almacenados 7. Utilice la bases de datos NorthWind para esta practica 8. Vamos a crear un procedimiento almacenado que ingrese un nuevo registro a la tabla Categories solo si el ID que se le enva como parmetro no existe.

9. Ejecutemos el procedimiento anterior comprobando si funciona correctamente


exec sp_Insertar_Categories 1, 'Alimentos' exec sp_Insertar_Categories 9, 'Alimentos'

10. En el siguiente procedimiento hacemos uso de la sentencia CASE para verificar si existen clientes en una determinada ciudad pasada como parmetro.

11. Ejecutemos el procedimiento anterior comprobando si funciona correctamente


exec sp_Hay_Clientes 'Barcelona' exec sp_Hay_Clientes 'New York'

12. Ejecucin dinmica de sentencias: la instruccin EXEC. Como hemos visto, la instruccin exec se utiliza para ejecutar un procedimiento almacenado, pero no slo eso, sino que adems sirve para evaluar una expresin de tipo carcter. Por ejemplo, el siguiente cdigo muestra como ejecutar un select de todas los Clientes.
Exec ('select * from customers')

Esto puede resultar muy til para montar sentencias en tiempo de ejecucin, cuyos valores no conocemos a priori, o para los cuales deseamos realizar un tratamiento distinto dependiendo de los valores que tomen. El siguiente cdigo mostrara un procedimiento almacenado que se encarga de realizar bsquedas de clientes. Recibe dos parmetros, uno es la ciudad y otro es el cdigo postal. Si se especifica nicamente la ciudad, se realizar una bsqueda de todos los clientes que sean de esta ciudad, mientras que si especifica el cdigo postal, se realizar una bsqueda, adems, por este atributo.

13. Si ejecutamos el anterior procedimiento almacenado, sin especificar ninguno de los parmetros, obtendremos todos los clientes
exec sp_Clientes null, null

14. Si especificamos el parmetro city = Madrid, obtendremos todos los clientes de la ciudad de Madrid
exec sp_Clientes 'Madrid', null

15. Si adems especificamos el parmetro codigo postal, obtendremos lo siguiente.


exec sp_Clientes 'Madrid', '28023'

Parte 3: Ejemplos de Descencadenadores 1. Crearemos un desencadenador para la tabla [Order Details] que se disparar cuando se inserte o se actualice la tabla y verificar si la cantidad de productos a ordenar es mayor a la cantidad de productos en existencia.

2. Insertemos dos registros en la tabla para comprobar el funcionamiento del trigger.


insert into [order details] values (10248,1, 14, 10, 0) insert into [order details] values (10248,5, 14, 10, 0)

En primera sentencia nos aparece un mensaje de transaccin realizada con xito En cambio en la segunda sentencia como no hay existencia suficiente se presenta un error y el trigger cancela el insert con ROLLBACK TRANSACTION. V. Anlisis de resultados 1. Teniendo las siguientes tablas: INVENTARIO (num_producto, descripcin, unidades_dispon, punto_pedido, cantidad_pedido) PEDIDOSPENDIENTES (num_producto, cantidad_pedido, fecha_pedido) Cree un desencadenador que se dispare cuando se actualice la tabla INVENTARIO, verifique si la cantidad de productos del inventario es menor o igual al campo punto_pedido, entonces inserte una lnea en la tabla PEDIDOSPENDIENTES con cantidad_pedido=100 solo si no existe una fila en la tabla para dicho producto. 2. Teniendo las siguientes tablas: CLIENTE (idCliente, Nombre, Apellido, DUI, FechaNac, Direccion) CUENTA (idCuenta, IdCliente, FechaReg) DETALLECUENTA (IdDetalle, IdCuenta, Fecha, Monto,Tipo) Cree un procedimiento almacenado para ingresar un nuevo Cliente, el procedimiento debe verificar que el DUI del nuevo cliente no exista, si no existe debe agregar el cliente y debe ingresar un registro en la tabla cuenta. Si existe debe mostrar un mensaje de error. 3. En la tabla DETALLECUENTA el campo Tipo almacena A para Abonos y C para cargos, realice un procedimiento que muestre la el saldo de un cliente que ser enviado como parmetro. El saldo de la cuenta es igual al total de cargos el total de abonos. VI. Referencia Bibliogrfica Microsoft SQL Server 2008, Gua Prctica, Francisco Charte Ojeda; Anaya Multimedia.

You might also like