5.1 procedimientos y funciones almacenados. 5.2 ... itd/taller de bases de datos/apuntes... ·...
TRANSCRIPT
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 1
Unidad 5SQL Procedural
5.1 Procedimientos y Funciones
Almacenados.
5.2 Disparadores (Triggers).
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 2
1. Se usará la Base de Datos llamadaLaConsentida.
use LaConsentida
2. Borrar la tabla CtasBanc anterior y crearla:
create table CtasBanc
(IdCuenta int auto_increment primary key,
tipo char(10),
saldo numeric(10,2))
5.1 Procedimientos y Funciones
Almacenados
MySQL
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 3
3. Añadir 2 tuplas:
insert into CtasBanc
values (1, 'Chequera',10000)
insert into CtasBanc
values (2, 'Inversión',0)
4. Consulte el contenido de la tabla:
select * from CtasBanc
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 4
5. La tabla CtasBanc contiene la informaciónde las dos cuentas de la miscelanea “laconsentida”, una de ellas es una chequera yotra es una inversión.
6. Con frecuencia se requieren efectuartraspasos entre las cuentas, es decir, moverdinero de una cuenta hacia la otra.Escribiremos dos procedimientos paraefectuar esas tareas
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 5
7. Los conceptos de programación relativos alos procedimientos y funciones sonaplicables a los procedimientosalmacenados.
8. Para poder escribir un procedimientoalmacenado en la Interfaz Workbench deMySQL o la Línea de Comandos, enprimer lugar hay que usar otro delimitador(en vez de punto y coma):
delimiter //
5.1 Procedimientos y Funciones
Almacenados
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 6
delimiter //
Create procedure
DepositoInversion(IN vImporte numeric(10,2))
BEGIN
update CtasBanc set saldo=saldo-vImporte
where IdCuenta=1;
update CtasBanc set saldo=saldo+vImporte
where IdCuenta=2;
END;
//
Termina la instrucción de creación del procedimiento, si no hubiéramos cambiado el delimitador, el primer “punto y
coma” se interpretaría como el final del create.
“vImporte” es un parámetro de valor ( IN = entrada ), la “v” la
elegimos para indicar que es una variable.
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 7
delimiter //
Create procedure
DepositoInversion(IN vImporte numeric(10,2))
BEGIN
start tansaction
update CtasBanc set saldo=saldo-vImporte
where IdCuenta=1;
update CtasBanc set saldo=saldo+vImporte
where IdCuenta=2;
commit;
END; //
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 8
delimiter ;
select * from CtasBanc;
call DepositoInversion(9000);
select * from CtasBanc;
Llamada a ejecución del procedimiento.
Instruye a MySQL para que el terminador sea de nuevo punto y
coma.
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 9
delimiter //
create procedure
RetiroInversion(IN vImporte numeric(10,2))
BEGIN
start tansaction
update CtasBanc set saldo=saldo-vImporte
where IdCuenta=2;
update CtasBanc set saldo=saldo+vImporte
where IdCuenta=1;
commit;
END; //
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 10
delimiter ;
select * from CtasBanc;
call RetiroInversion(5000);
select * from CtasBanc;
call DepositoInversion(1000);
select * from CtasBanc;
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 11
1. Se usará la Base de Datos llamadaLaConsentida.
use LaConsentida
2. Borrar la tabla CtasBanc anterior y crearla:
create table CtasBanc
(IdCuenta int identity primary key,
tipo char(10),
saldo numeric(10,2))
SQL Server
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 12
3. Añadir 2 tuplas:
insert into CtasBanc
values ('Chequera',10000)
insert into CtasBanc
values ('Inversión',0)
4. Consulte el contenido de la tabla:
select * from CtasBanc
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD-13
create procedureDepositoInversion @vImporte numeric(10,2) asBEGIN
begin transactionupdate CtasBanc
set saldo=saldo-@vImportewhere IdCuenta=1
update CtasBancset saldo=saldo+@vImportewhere IdCuenta=2
commitEND
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 14
select * from CtasBanc
execute DepositoInversion 1000
select * from CtasBanc
Llamada a ejecución del procedimiento.
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 15
create procedureRetiroInversion @vImporte numeric(10,2) asBEGIN
begin transactionupdate CtasBanc
set saldo=saldo-@vImportewhere IdCuenta=2
update CtasBancset saldo=saldo+@vImportewhere IdCuenta=1
commit
END
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 16
select * from CtasBanc
execute RetiroInversion 5000
select * from CtasBanc
execute DepositoInversion 1000
select * from CtasBanc
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 17
Para la Base de Datos LaConsentida, escriba un procedimiento llamado SaldosIniciales que reciba dos valores, correspondientes al saldo de cada cuenta y los asigne a las tuplascorrespondientes de la tabla CtasBanc.
El procedimiento debe asumir que las tuplas ya existen en la tabla.
EjercicioMySQL y SQL Server
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 18
delimiter $$
create function SaldoCuenta(vCuenta int)
returns numeric(10,2)
BEGIN
declare vSaldo numeric(10,2);
select saldo from CtasBanc where IdCuenta=vCuenta
into vSaldo;
return vSaldo;
END $$
delimiter ;
MySQL
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 19
select * from CtasBanc;
set @vSaldoChequera = SaldoCuenta(1);
select @vSaldoChequera;
call DepositoInversion(3000);
select SaldoCuenta(1),SaldoCuenta(2);
Llamada a ejecución de la función (tiene que incluirse en un select o asignarse a
una variable
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 20
SQL SERVER
create function SaldoCuenta(@vCuenta int)returns numeric(11,2)
asBEGINdeclare @vSaldo numeric(11,2)select @vSaldo=saldo from CtasBanc
where IdCuenta=@vCuenta return @vSaldo
END
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 21
select dbo.SaldoCuenta(1) as Chequeraselect dbo.SaldoCuenta(2) as Inversion
update CtasBanc set saldo=1000 where idCuenta=2
update CtasBanc set saldo=9000where idCuenta=1
select dbo.SaldoCuenta(1) as Chequeraselect dbo.SaldoCuenta(2) as Inversion
dbo es el esquema por default, Sql
Server lo obliga en la sintáxis
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 22
begin transactionexecute DepositoInversion 4000if dbo.SaldoCuenta(1)<0
rollbackelse
commit
select * from CtasBanc
-- EJECUTE ESTA TRANSACCIÓN 3 o MÁS VECES
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 23
begin transactionexecute RetiroInversion 3500if dbo.SaldoCuenta(2)<0
rollbackelse
commit
select * from CtasBanc
-- EJECUTE ESTA TRANSACCIÓN 3 VECES
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 24
En base al esquema de abajo:1. Diseñe una transacción para añadir a cierto alumno una
materia a cursar.2. Diseñe una función que de como resultado el número de
materias que tiene un alumno.3. En la transacción, si luego de añadir una materia, el
número de materias cursadas sobrepasa 5, no se deberá registrar la nueva materia cursada.
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 25
Ejercicio 2:Del esquema de la página anterior elimine la columna NumMatCursadasde la tabla Alumnos y escriba una expresión de consulta que reporte los nombres de los alumnos y el numero de materias cursadas por cada alumno. Use una función que cuente el número de materias cursadas de un alumno en particular.Modifique la transacción creada en el ejercicio anterior para que de el resultado esperado de acuerdo al nuevo esquema.
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 26
Ejercicio:Escriba un procedimiento almacenado en una Base de Datos de MySQL para
enviar como parámetros los valores a insertar en una tupla de la tabla
Materias.
Los datos que se envían al procedimiento deben ser todos excepto
NumCreditos (esa columna se calcula de la siguiente manera:
HorasTeoria*2+HorasPractica).
En caso de que se requiera de dos o mas comandos DML para resolver el
problema, se deberá definir una transacción para evitar que se conserve una
tupla con datos incompletos.
MateriasIdMateria ClaveMat Nombre Creditos HorasTeo HorasPra
1 1810 Estructuras de Datos 10 4 22 1533 Inv. De Operaciones II 8 4 0
3 1001 Matemáticas I 8 4 0
4 1805 Probabilidad y Estadística 6 3 0
5 1806 Programación orientada a objetos 8 3 26 1813 Fundamentos de Bases de Datos 8 4 0
5.1 Procedimientos y Funciones
Almacenados
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 27
Un trigger es un objeto de la B.D., que está asociadocon una tabla y que se activa cuando cierto eventoocurre.
Los eventos que el DBMS monitorea para efectos delos triggers son: insert, update, delete.
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 28
Los triggers pueden configurarse para que seactiven antes o después del eventocorrespondiente.
Por ejemplo:
Un trigger que se active antes de que se borreuna tupla.
Un trigger que se active después de que semodifique una tupla.
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 29
MySQL
Crear una Base de Datos llamada Unidad 5 y enella crear las siguientes tablas:
create table Maestros (
IdMaestro int auto_increment primary key,
Curp char(18) unique,
Nombre varchar(40),
Email varchar(40) unique)
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 30
create table
InasistMaestros (
IdInasistM int auto_increment primary key,
IdMaestro int references Maestros,
Fecha date,
Hora time)
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 31
create table Mensajes (
IdMensaje int auto_increment primary key,
NombreDestinatario varchar(40),
Email varchar(40),
Texto text,
FueEnviado boolean)
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 32
Ahora se creará un trigger que se activará cada vez que se añada una tupla correspondiente a la Inasistencia de un profesor al aula.
El trigger causará la adición de una tupla en una tabla de mensajes de correo para que posteriormente, de manera automática, se envíe el mensaje al profesor comunicándole que deberá justificar la inasistencia o procederá un descuento en su salario.
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 33
create trigger tInasistMaestros
after insert on InasistMaestros
for each row insert into Mensajes
select 0,Nombre,Email,
'Se le ruega justificar inasistencia o procederá descuento', 0
from Maestros where IdMaestro=new.IdMaestro;
5.2 Disparadores (Triggers)
new se refiere a la nuevatupla recién insertada en
InasistMaestros
Complemente el mensaje
concatenandolo con la fecha y hora de la
Inasistencia
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 34
Para acceder a las tupla recién insertada en
MySQL, se debe hacer referencia, como ya
se vio, a una seudotabla llamada new.
Cuando el trigger se activa a consecuencia de
un update, new y old contienen los datos
nuevos y originales respectivamente.
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 35
Añada las siguientes tuplas:
insert into Maestros
values ( 0, 'U1','Uno', '[email protected]');
insert into Maestros
values ( 0, 'D2','Dos', '[email protected]');
insert into Maestros
values ( 0, 'T3', 'Tres', '[email protected]');
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 36
Haga las siguientes consultas:
select * from Maestros;
select * from InasistMaestros;
select * from Mensajes;
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 37
Añada la siguiente tupla:
insert into InasistMaestros
values ( 0, 2, cast('2016-10-31' as date),
cast('11:00' as time) )
Haga las siguientes consultas:
select * from Inasistmaestros;
select * from Mensajes;
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 38
Se asume que deberá crearse un proceso que seleccione de la tabla Mensajes aquellos que no han sido enviados aún por correo electrónico para que se lleve a cabo el envío.
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 39
Ejemplo SQL Server
create database Unidad5
use unidad5
create table Maestros( IdMaestro int identity primary key,
Curp char(18) unique,Nombre varchar(40),Email varchar(40) unique)
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 40
create table InasistMaestros ( IdInasistM int identity primary key,
IdMaestro int references Maestros,fecha date, hora time)
create table Mensajes ( IdMensaje int identity primary key,
NombreDestinatario varchar(40),Email varchar(40),Texto text,FueEnviado bit)
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 41
create trigger tInasistMaestroson InasistMaestros after insertas insert into MensajesselectNombre,Email,'Se le ruega justificar inasistencia o procederá descuento',0 fromMaestros,insertedwheremaestros.IdMaestro=inserted.IdMaestro
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 42
Para acceder a las tupla recién insertada en
SQL Server, se debe hacer referencia, como ya
se vio, a una seudotabla llamada inserted.
Cuando el trigger se activa a consecuencia de
un update, inserted y deleted contienen los
datos nuevos y originales respectivamente.
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 43
Añada las siguientes tuplas:
insert into Maestros values ( 'U1','Uno', '[email protected]')insert into Maestros values ( 'D2','Dos', '[email protected]')insert into Maestros values ( 'T3', 'Tres', '[email protected]')
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 44
Haga las siguientes consultas:
select * from Maestrosselect * from Inasistmaesselect * from Mensajes
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 45
Añada la siguiente tupla:
insert into InasistMaes values ( 3, '2016-10-31', '11:00' )
Haga las siguientes consultas:
select * from Inasistmaes;select * from Mensajes;
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 46
En MySQL y SQL Server:
1. Haga los cambios necesarios al esquema y
modifique el trigger tInasistMaestros para que
solo las inasistencias injustificadas sean las que
ocasionen el mensaje de correo.
2. Añada otro trigger para que en caso de que una
inasistencia cambie su tipo a “justificada”, se
envíe un mensaje en el que se le comunica al
profesor que su inasistencia ha sido justificada y
no se le realizará descuento alguno.
5.2 Disparadores (Triggers)
Taller Bases de Datos ISC Ing. Felipe Alanís González -ITD- 47
Pruebe el trigger del ejercicio 2 de la página
anterior para que se cambie la fecha.
En ese caso no debe producirse un mensaje
relativo a la justificación de la inasistencia, sino
a que se modificó la fecha de valor antiguo a
valor nuevo.
5.2 Disparadores (Triggers)