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

SISTEMAS DE GESTION DE BASE DE DATOS - SQL 2 Asir

1

FUNCIONES
1) ESCALARES
Devuelven un valor nico

Ejemplo.
CREATE FUNCION fn_MultiplicaSaldo
(
@NumCuenta VARCHAR(20)
@Multiplicador DECIMAL(10,2)
)
RETURNS DECIMAL (10,2)
AS
BEGIN
DECLARE @Saldo DECIMAL (10,2),
@Return DECIMAL (10,2)
SELECT @Saldo = Saldo FROM Cuentas WHERE NumCuenta = @NumCuenta
SET @Return = @Saldo*@Multiplicador
RETURN @Return
END

Uso de la funcin
a) Script
SELECT IDcuenta, NumCuenta, Saldo, FxAlta
dbo.fn_Multiplasaldo (NumCuenta, IDcuenta) AS Resultado
FROM cuentas
b) Script
DECLARE @NumCuenta VARCHAR (20),
@Resultado DECIMAL (10,2)
SET @NumCuenta='200700000001'
SET @Resultado=dbo.fn_MultiplicaSaldo (@NumCuenta, 30.5)
PRINT @Resultdao
tipo de datos que devuelve
variables de entrada

SISTEMAS DE GESTION DE BASE DE DATOS - SQL 2 Asir
2

2) LINEA
CREATE FUCION fn.MovimientosCuenta
(
@NumCuenta VARCHAR(20)
)
RETURNS TABLE
AS
RETURN
( SELECT Movimientos *
FROM Movimientos INNER JOIN Cuentas
ON Movimientos.IDcuenta=Cuentas.IDcuenta
WHERE Cuentas.NumCuenta=@NumCuenta)

SELECT * FROM fn_MovientosCuentas ('200700000001')



















SISTEMAS DE GESTION DE BASE DE DATOS - SQL 2 Asir
3

DISPARADORES (TRIGGERS)
Un trigger es un procedimiento almacenado que se ejecuta automticamente cuando se
produce un evento en el servidor.
Trigger DML: se ejecuta cuando un usuario intenta modificar datos mediante un
evento DML (INSERT, UPDATE, DELETE)
Trigger DDL: se ejecuta con eventos del tipo (CREATE, ALTER, DROP)

1) Trigger DML
Sintaxis: CREATE TRIGGER <nombre>
on <tabla>
ALTER <insert, update, ... >
AS
BEGIN
...
...
END

2) Tablas Temporales: tiene la misma estructura que la tabla que desencadena el disparador.
INSERTED:
Solo disponible con INSERT y UPDATE
Contiene los valores despus de la insercin
Estar vaca DELETE
DELETED:
Disponible con UPDATE y DELETE
Valores anteriores a la ejecucin o borrado
Estar vaca INSERT







SISTEMAS DE GESTION DE BASE DE DATOS - SQL 2 Asir
4

Ejemplo:
Grabar en Histrico de Saldos cada vez que se modifica el saldo de la tabla cuentas
Cuentas Histrico Saldo
ID Saldo ID Saldo Fecha
1
2
3
400
800
600

+500
2 500 10/1/2013

CREATE TRIGGER TR_Cuentas
ON Cuentas
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON --no generan mensajes
INSERT INTO Historico_Saldos
(IDcuenta, Saldo, FxSaldo)
SELECT IDcuenta, Saldo, Getdate()
FROM INSERTED
END














SISTEMAS DE GESTION DE BASE DE DATOS - SQL 2 Asir
5

Ejemplo2:
Script
UPDATE Cuentas
SET Saldo=Saldo+10
WHERE IdCuenta=1

Cambio
ALTER TRIGGER TR_Cuentas
ON Cuentas
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON
IF UPDATE (Saldo) podemos especificar a qu columna afecta el TRIGGER
BEGIN
INSERT INTO Historico_Saldo
(IDcuenta, Saldo, Fecha)
SELECT IDcuenta, Saldo, GetDate()
FROM Inserted
END
END












SISTEMAS DE GESTION DE BASE DE DATOS - SQL 2 Asir
6

3) Trigger DDL
Ejemplo
Impedir que se ejecuten sentencias DROP TABLE y ALTER TABLE en la base de datos.

CREATE TRIGGER TR_Seguridad
ON DATABASE For DROP TABLE
ALTER TABLE
AS
BEGIN
RAISERROR ('No est permitido borrar ni modificar tablas!')
ROLLBACK TRANSACTION
END

Ejemplo2
FOR INSERT
Queremos que se guarde en la tabla EMPLEADOS INSERTADO el historial de inserciones
realizados en la tabla empleados, adems de los datos de Empleados se debern guardar datos
del usuario que realizo la insercin y la fecha de la operacin.
EMPLEADOS EMPLEADOS INSERTADOS
Dni
Nombre
Saldo
Insert
------>
Dni
Nombre
Saldo
Usuario
Fecha

CREATE TRIGGER HistorialEmpleados
ON Empleados
FOR INSERT
AS
BEGIN
INSERT INTO EmpleadosInsertados
SELECT *, suser_SNAME() AS usuario, Getdate() AS Fecha
FROM Inserted
END
SISTEMAS DE GESTION DE BASE DE DATOS - SQL 2 Asir
7


Ejemplo3
- Queremos que los pedidos no se puedan eliminar fsicamente, en vez de eliminarlo se
marcara como baja
- Para ello debemos aadir a PEDIDOS un campo BAJA que contendr 0 o 1
En principio estar en 0 y cuando se intente borrar el pedido, en vez de borrar el pedido se
marcara el campo en 1.

Disparador
CREATE TRIGGER Eliminar Empleados
ON Empleados INSTEAD OF DELETE
-- el trigger se pondr en marcha en vez de el DELETE que lo lanzo
AS
BEGIN
UPDATE Empleados SET Baja=1
FROM Empleados INNER JOIN Deleted
ON Empleados.Dni=Deleted.Dni
END















SISTEMAS DE GESTION DE BASE DE DATOS - SQL 2 Asir
8

CURSORES
Introduccin
Un Cursor es una variable que nos permite recorrer un conjunto de resultados obtenidos a
travs de una sentencia SELECT.
- Declarar el cursor: DECLARE
- Abrir el cursor: OPEN
pasos: - Leer los datos del cursor FETCH INTO
- Cerrar el cursor: CLOSE
- Liberar el cursor: DEALLOCATE

DECLARACION: se indica el nombre del cursor y la sentencia SQL.
DECLARE ProdInfo
CURSOR FOR
SELECT ProductNumber, Name
FROM Productos

APERTURA: ejecuta la sentencia SQL y Cargar datos
OPEN ProdInfo

RECORRIDO DEL CURSOR Y ACCESO A DATOS: recorre el resultado del cursor y las filas ledas
podrn copiarse a variables utilizando la sentencia
INTO
FETCH NEXT FROM ProdInfo INTO @IDprod, @Descripcion

CIERRE DEL CURSOR: es posible la reapertura del mismo
CLOSE Prod Info

DESARROLLO DEL CURSOR: no es posible la reapertura (solo al final)
DEALLOCATE ProdInfo




SQL
SISTEMAS DE GESTION DE BASE DE DATOS - SQL 2 Asir
9

Ejemplo: Recorre la tabla de Productos y nos muestra la operacin en pantalla.
DECLARE @Descripcion AS VARCHAR(50)
DECLARE ProdInfo CURSOR FOR
SELECT Nombre FROM Productos
OPEN ProdInfo
FETCH NEXT FROM ProdInfo INTO @Descripcion
WHILE @@fetch-status=0
BEGIN
PRINT @Descripcion
FETCH NEXT FROM ProdInfo INTO @Descripcion
END
CLOSE ProdInfo
DEALLOCATE Prodinfo

Ejemplo2:
Codigo Nombre Precio
1
2
3
4
5
Camisas
Zapatos
Pantalones
Faldas
Calcetines
40
20
30
25
10
DECLARE @ID int, @Nombre VARCHAR(25), @Apellido1 VARCHAR(25),
@Apellido2 VARCHAR(25), @NifCif VARCHAR(9), @FxNacimiento DATETIME
DECLARE cCliente CURSOR FOR
SELECT Id, Nombre, Apellido1, Apellido2, NifCif, FxNacimiento
FROM clientes
OPEN cClientes
FETCH cClientes INTO @ID, @Nombre, @Apellido1, @Apellido2, @NifCif, @FxNacimiento
WHILE (@@Fetch-Status=0)
BEGIN
PRINT @Nombre + ' ' + @Apellido1 + ' ' + @Apellido2
FETCH cClientes INTO @ID, @Nombre, @Apellido1, @Apellido2, @NifCif, @FxNacimiento
END
CLOSE cClientes
DEALLOCATE cClientes

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