Você está na página 1de 30

Bases de Datos SQL

SQL
Jorge Prez R. e Universidad de Talca, II Semestre 2006

Bases de Datos SQL

SQL + Procedural
La mayor de los DBMS actuales permiten extensiones de SQL a para la creacin de bloques de ejecucin similares a los de un o o lenguaje de programacin de propsito general. o o Sintaxis y Semntica no estndar, depende del DBMS pero son a a muy similares en general. Nosotros estudiaremos en particular a SQLServer (Para Oracle es muy similar).

Bases de Datos SQL

SQL + Procedural
Los bloques pueden almacenarse en el DBMS en forma compilada para que los clientes de la BD puedan acceder a ellos. Algunas instrucciones generales: declare: declaracin de variables. o set: asginacin de variables. o if. . .else: control de ujo. while: control de ujo. begin. . .end: agrupacin en bloques. o Todas las variables comienzan con @, por ejemplo: @mivariable, y se pueden usar en vez de cualquier valor constante.

Bases de Datos SQL

SQL + Procedural
declare se usa para declarar variables en un bloque de instrucciones. declare @maximo money Para asignar valores a variables se puede usar set o el resultado de una consulta. set @maximo = 100000 select @maximo = max(salario) from empleado Se pueden usar para evitar las consultas anidadas (subconsultas).

Bases de Datos SQL

SQL + Procedural
if se usa para decidir el ujo de las instrucciones if @maximo <= 2000000 begin ... end Se puede usar por ejemplo para hacer actualizaciones condicionales. while se usa de forma similar para repetir instrucciones mientras cierta condicin sea verdadera. o while @maximo <= 2000000 begin ... end

Bases de Datos SQL

Funciones de Usuario
Usando bloques de instrucciones se pueden crear funciones de usuario que pueden usarse en consultas simples. Se usa el comando create function para crearlas y return para el valor de retorno: create function func(@parametro1 tipo1, ...) returns money as begin ... return @valor_retorno end

Bases de Datos SQL

Funciones de Usuario (cont.)


Si func es una funcin que recibe un tipo money se podr hacer o a una consulta: select nombre, due~o.func(salario) n from empleado Como una funcin es un objeto almacenado en el DBMS, esta o debe tener un dueo. n Por defecto el dueo es dbo, si se quiere forzar otro dueo se debe n n especicar al momento de crear la funcin. o

Bases de Datos SQL

Funciones ya Construidas
SQLServer al igual que la mayor de los DBMS comerciales, a provee funciones ya construidas. Funciones para manipular fechas: day, month, year, getdate, dateadd,... Funciones matemticas: abs, cos, sin, floor, ceiling,... a Funciones de strings: substring, lower, upper, trim,... Pueden crearse funciones ms complejas que usen estas funciones a para calcular su resultado.

Bases de Datos SQL

Procedimientos Almacenados
(Stored Procedures) Son procedimientos que se encuentran compilados y almacenados en el DBMS. Pueden realizar operaciones de mantenimiento, actualizacin, o insercin, eliminacin y consulta. o o Pueden recibir parmetros para realizar sus tareas. a Son excelentes para mantener seguridad, encapsulamiento y para aumentar la eciencia de las aplicaciones que funcionan con interaccin con DBMS. o

Bases de Datos SQL

10

Procedimientos Almacenados (cont.)


Para crear un procedimiento almacenado usamos create. almacenados en el DBMS. create procedure miprocedimiento @parametro1 tipo1, ... as begin ... end Un procedimiento no tiene un valor de retorno, pero puede producir resultado en la forma de una o varias consultas.

Bases de Datos SQL

11

Restricciones de Integridad
Hasta ahora los tipos de restricciones de integridad que hemos visto usan un modelo esttico, dependen de valores constantes. a Son controladas cada vez que el elemento asociado cambia (en cualquier forma). Hemos usado: Restricciones de unicidad llaves primarias. Restricciones referenciales llaves forneas. a Restricciones de dominio formatos de strings, rangos de valores, etc. Las restricciones que hemos visto, son impuestas por el diseador n de la BD y ejecutadas por el DBMS.

Bases de Datos SQL

12

Restricciones Complejas
Si quisiramos restricciones ms complejas como: e a Un empleado que es supervisor de un departamento nunca pueda ganar menos de $500.000. La suma de los salarios de todos los empleados de cierto departamento nunca puede exceder los $10.000.000. En una base de datos de facturas, el monto de una factura siempre debe ser igual a la suma de los temes (productos) asociados a la factura. No pueden expresarse en forma esttica (usando check), de hecho a las restricciones anteriores involucran ms de una tabla de la base a de datos. Necesitamos que el programador de la base de datos pueda crear bloques de ejecucin para implementar estas restricciones. o

Bases de Datos SQL

13

Reglas de Negocio
Adems de chequear restricciones en un sistema de BD nos podr a a interesar la ejecucin de acciones en forma automtica. o a Muchas veces estas acciones estn vinculadas a reglas de negocio. a Por ejemplo, en una BD de inventario de una empresa, podr a interesarnos que al momento que el stock de un producto bajara de cierto rango, automticamente se generara una nota de pedido a de ese producto. Son similares a las restricciones complejas pero desde un punto de vista de generar una accin ms que de prohibirla. o a Las restricciones complejas pueden ser vistas como un tipo de reglas de negocio.

Bases de Datos SQL

14

Triggers
El estndar SQL3 dene procedimientos llamados triggers o a disparadores especialmente diseados para este tipo de n restricciones y reglas de negocio. A pesar de que los DBMSs comerciales trabajan a nivel de SQL2, en el aspecto de restricciones complejas se acercan mucho ms a a SQL3. Los triggers son bloques de cdigo SQL + Procedural que o permiten chequear y forzar restricciones complejas de integridad y ejecutar acciones automticas. a Son ejecutados por el DBMS ante ciertos eventos que pueden ser denidos al momento de crear el trigger. Un trigger puede ejecutarse bajo ciertas condiciones, si la condicin de trigger es satisfecha. o

Bases de Datos SQL

15

Triggers (cont.)
(estndar SQL3) a Un trigger siempre se vincula a un evento sobre una tabla de la base de datos: insercin, actualizacin o eliminacin. o o o Se puede especicar que las acciones del trigger ocurran antes, despus o en vez del evento que lo gatilla. e Dentro del cdigo del trigger el procedimiento puede referirse a o todas las antiguas y nuevas tuplas que fueron insertadas, actualizadas o eliminadas: antiguas antes de la actualizacin o eliminacin o o nuevas despus de la actualizacin o insercin e o o Los eventos de actualizacin se pueden vincular, adems de a una o a tabla, a un atributo de ella.

Bases de Datos SQL

16

Triggers (cont.)
Si quisiramos hacer un trigger que prevenga el hecho de que un e empleado que es supervisor de un departamento nunca pueda ganar menos de $500.000, podr amos hacer un trigger que: Est vinculado a una actualizacin de la tabla EMPLEADO. e o Para cada una de las tuplas nuevas hacer join con la tabla SUPERVISA y seleccionar los empleados que supervisan a un departamento y tienen salario menor a $500.000. Realizar una de las siguientes acciones: Borrar las tuplas problemticas de la tabla SUPERVISA, a o Actualizar los salarios problemticos a $500.000, a o Deshacer la actualizacin. o

Bases de Datos SQL

17

Triggers (cont.)
La decisin que se tome dependern del negocio. o a Por qu no es necesario hacer un trigger para la insercin de e o tuplas en EMPLEADO? De hecho, slo nos importa las actualizaciones a ciertos atributos o de la tabla EMPLEADO. Mucho cuidado!!!: Para completar la restriccin tambin se o e debiese hacer un trigger de insercin en la tabla SUPERVISA!!! o

Bases de Datos SQL

18

Triggers en SQLServer
SQLServer soporta triggers de una manera cercana al estndar a SQL3. Algunas restricciones: soporta slo triggers despus o en vez o e de. Para crear un trigger se usa create trigger. Para especicar el momento de ejecucin se usa after (despus o e de) o instead of (en vez de).

Bases de Datos SQL

19

Triggers en SQLServer (cont.)


Dentro del trigger se puede acceder a dos tablas virtuales: deleted: contiene todas las tuplas eliminadas inserted: contiene todas las tuplas insertadas En una actualizacin que afecta a la tupla t, el antiguo valor de t o aparece en deleted el nuevo en inserted. Por ejemplo si una actualizacin actualiza la tupla o (P01,Proyecto1,A01) a la nueva tupla (P01,NuevoProyecto1,A01): La tupla (P01,Proyecto1,A01) aparece en deleted La tupla (P01,NuevoProyecto1,A01) aparece en inserted

Bases de Datos SQL

20

Triggers en SQLServer (cont.)


La creacin de un trigger en SQLServer se hace: o create trigger mi_trigger on mi_tabla after update as ... after puede cambiarse por instead of update puede cambiarse por la lista update, insert, delete o cualquier subconjunto de ella. En el cuerpo del trigger se puede referenciar a inserted y deleted .

Bases de Datos SQL

21

Triggers en SQLServer (cont.)


En el cuerpo de un trigger tambin se puede usar la funcin e o update(atributo) que recibe un atributo y retorna verdadero si el evento involucra actualizaciones del atributo y falso en otro caso. Por ejemplo si una actualizacin actualiza la tupla o (P01,Proyecto1,A01) a la nueva tupla (P01,NuevoProyecto1,A01) en la tabla PROYECTO(codigo,nombre,departamento_codigo): update(codigo) retorna falso update(nombre) retorna verdadero Puede usarse update(nombre) dentro de una sentencia if.

Bases de Datos SQL

22

Triggers en SQLServer Ejemplo


El siguiente es un ejemplo de trigger en SQLServer
create trigger minimo_salario_supervisor on empleado after update as if update(salario) begin update empleado set salario = 500000 where rut in ( select rut from inserted as i join supervisa_departamento as s on s.empleado_rut = i.rut where i.salario < 500000 ) end

Bases de Datos SQL

23

Triggers en SQLServer (cont.)


Mucho cuidado se debe tener con las tablas virtuales inserted y deleted Supongamos que tenemos una tabla de historial para almacenar los eventos que ocurren sobre la tabla empleado. La tabla de historial almacena el rut del empleado, la fecha del evento y un comentario acerca del evento. Queremos hacer un trigger que en forma automtica para cada a insercin, actualizacin y eliminacin inserte una tupla en la tabla o o o de historial.

Bases de Datos SQL

24

Triggers en SQLServer (cont.)


El siguiente podr ser un trigger que ejecute la accin para el a o evento insert
create trigger historial_empleado_insert on empleado after insert as declare @rut char(8) select @rut = rut from inserted insert into historial_empleado values (@rut,getdate(),Empleado insertado en la BD.)

Este trigger no cumple el objetivo requerido, tiene un GRAVE error Cul? a

Bases de Datos SQL

25

Triggers en SQLServer Ejemplo


Este trigger s cumple las caracter sticas deseadas para la insercin. o
create trigger historial_empleado_insert on empleado after insert as insert into historial_empleado select rut, getdate(), Empleado insertado en la BD. from inserted

Se insertan las tuplas que resultan de una consulta. El error fue suponer que inserted ten slo una tupla. a o Los triggers para actualizacin y eliminacin son similares. o o

Bases de Datos SQL

26

Cursores
Un cursor es un puntero a una tupla en el resultado de una consulta. El cursor puede ir avanzando por las tuplas a medida que se necesita. Inicialmente el cursor se encuentra en la primera tupla de la consulta y puede avanzar hasta despus de la ultima tupla. e Los cursores son la forma ms verstil de acceder a los datos de a a una consulta. Por ejemplo, en un trigger podr amos con un cursor recorrer una a una las tuplas en las tablas inserted y deleted, y tomar decisiones particulares para cada tupla.

Bases de Datos SQL

27

Cursores en SQLServer
Un cursor es un tipo especial de datos. Para crear un cursor se usa declare mi_cursor cursor for <consulta> Lo anterior declara un cursor de nombre mi_cursor que puede avanzar por las tuplas resultado de <consulta>. Para hacer avanzar al cursor se usa fetch: fetch next from mi_cursor into <lista de variables> Lo anterior almacena los datos de la tupla actual del cursor en la lista de variables y luego hace avanzar al cursor.

Bases de Datos SQL

28

Cursores en SQLServer (cont.)


Para saber si el ultimo fetch fue exitoso se usa la variable @@fetch_status: @@fetch_status = 0: el ultimo fetch fue exitoso. @@fetch_status = -1: el ultimo fetch fall o el cursor se o encuentra fuera del rango de la consulta. @@fetch_status puede usarse dentro de un loop while para recorrer todas las tuplas hasta que el cursor salga del rango. Cuidado!: @@fetch_status es global para todos los cursores en una conexin. o

Bases de Datos SQL

29

Cursores en SQLServer (cont.)


Para comenzar a usar un cursor se debe abrir haciendo open mi_cursor. Cuando se termina de usar un cursor se debe cerrar haciendo close mi_cursor. Dado que el cursor es un puntero, al terminar de usarlo adems se a debe liberar los recursos usados haciendo deallocate mi_cursor.

Bases de Datos SQL

30

Cursores en SQLServer Ejemplo


El siguiente ejemplo imprime una lista con info de los departamentos
declare @nombre varchar(50) declare @direccion varchar(100) declare departamento_cursor cursor for select nombre, direccion from departamento open departamento_cursor fetch next from departamento_cursor into @nombre, @direccion while @@fetch_status = 0 begin print(Departamento de + @nombre + , Direccin: + @direccion) o fetch next from departamento_cursor into @nombre, @direccion end close departamento_cursor deallocate departamento_cursor

Você também pode gostar