You are on page 1of 8

Ej1.

Procedure Num_Pedidos_Empleado
Procedimiento que calcula el numero de pedidos de un empleado
Usa la base de datos neptuno (en recursos)
CREATE PROCEDURE `neptuno`.`num_pedidos_empleado` (in id_empleado int)
BEGIN
SELECT COUNT(*) AS NumPedidos
FROM pedido
WHERE IdEmpleado = id_empleado;
END
Ejecucin
call num_pedidos_empleado(1);

Ej2. Procedure ImportePedido


Usar base de datos neptuno (recursos).
Calcular el importe de un pedido
Entrada: N de Pedido
Salida: Importe
CREATE PROCEDURE `neptuno`.`importe_pedido` (
in num_pedido int,
out importe double)
BEGIN
SELECT
SUM(PrecioUnidad*Cantidad*(1-Descuento)) INTO importe
FROM
detalles_de_pedido
WHERE
IdPedido = num_pedido;
END
Ejecucin
call importe_pedido(10248, @importe);
select @importe;

Ej3. Procedure comisiones


Crear la tabla comisiones en Neptuno:
create table comision (
Anno int,
Mes int,
IdEmpleado int,
Importe double
PRIMARYKEY(Anno, Mes, IDEmpleado)
);
Calcula la comisin de ventas para un empleado
El clculo es Total Venta * 0.10

Entrada: Anno, Mes, IdEmpleado


Calcular la comisin y actualizar y/o crear el registro de comisiones
DELIMITER $
CREATE DEFINER=`root`@`localhost` PROCEDURE `calcular_comision`(in
anno_introducido int, mes_introducido int, Id_Empleado int)
BEGIN
declare comision_calculada double;
set comision_calculada = (SELECT SUM(Cantidad*PrecioUnidad*(1Descuento))*0.1 FROM detalles_de_pedido JOIN pedido
ON detalles_de_pedido.IdPedido = pedido.IdPedido
WHERE YEAR(FechaPedido) = anno_introducido
AND MONTH(FechaPedido) = mes_introducido
AND IdEmpleado = Id_Empleado);
if (select Count(*) from comision where IdEmpleado = Id_Empleado and
anno = anno_introducido and mes = mes_introducido) = 0 then
insert into comision values
(anno_introducido,mes_introducido,Id_Empleado,comision_calculada);
else
Update comision set importe=comision_calculada where IdEmpleado =
Id_Empleado and anno = anno_introducido and mes = mes_introducido;
end if;
END
Ejemplo Ejecucin:
call neptuno.calcular_comision(1996,7,5);
select * from comision

Ej4. PROCEDURE Insertar_Comision

Procedure:
o

Insertar_Comision

Objetivo:
o

Insertar un registro con datos validados en la tabla comisin. Si los


datos no son correctos no se inserta

Entrada:
entrada_anno

dato entre 1900 y ao actual

entrada_mes

dato entre 1 y 12

entrada_id_empleado

id_empleado existente

entrada_importe

dato >= 0

--------------------------------------------------------------------------------- Routine DDL


-- Note: comments before and after the routine body will not be stored
by the server
-------------------------------------------------------------------------------DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `insertar_comision`(


in entrada_anno int,
in entrada_mes int,
in entrada_Id_Empleado int,
in entrada_Importe double,
out exito tinyint)
BEGIN

SET exito = TRUE;


if (entrada_anno <1900 or entrada_anno > Year(now())) then
SET exito = FALSE;

else if (entrada_mes < 1 or entrada_mes>12) then


SET exito = FALSE;
else if ((Select Count(*) from empleado where IdEmpleado =
entrada_Id_Empleado)=0) then
SET exito = FALSE;
end if;
end if;
end if;

if exito then
Insert Into comision values ( entrada_anno, entrada_mes,
entrada_Id_Empleado, entrada_Importe);
select "Insercin correcta";
else
select "Error en datos";
end if;

END
Ejemplo Ejecucin
call neptuno.insertar_comision(2000,55,5,120, @exito);
select @exito;

Ej1. Funcin nd
DELIMITER $$
CREATE FUNCTION nd(entrada varchar(50)) returns varchar(50)
Begin
/* Si entrada es NULL devuelve el texto No Disponible sino
devuelve la entrada*/
declare salida varchar(50);
if (entrada is NULL) then
set salida = "No Disponible";
else

set salida = entrada;


end if;
return salida;
End

select nd(region) from cliente

Ej1. TRIGGER comision_bi


DELIMITER $$
CREATE TRIGGER comision_bi
BEFORE INSERT
ON comision
FOR EACH ROW
Begin
/* No permitir que la comisin sea negativa
En ese caso se pasa a 0
*/
if new.Importe < 0 then
set new.Importe = 0;
end if;

End;

Ej2. TRIGGERS para auditar comisiones


create table auditar_comision (
Anno int,
Mes int,
IdEmpleado int,
fecha timestamp
operacion char
);

operacion; I-U-D

Estos ejercicios es la continuacin de SQL


Bsico, desde aqu.
1.- Crear un procedimiento almacenado que
permita grabar datos a la Tabla ALUMNO.
/*Procedimiento almacenado para grabar los datos a la tabla
alumno*/
DELIMITER $$
CREATE PROCEDURE `bdcolegio`.`GRABAR_DATOS_ALUMNOS`
(
Cdigo INT(5),
Nombre VARCHAR(30),
Apellido VARCHAR(35),
Direccin VARCHAR(75),
Email VARCHAR(45),
Fecha_Nacimiento DATE,
Distrito VARCHAR(70),
Pensin VARCHAR(15)
)
BEGIN
INSERT INTO alumno VALUES (Cdigo, Nombre, Apellido,
Direccin, Email, Fecha_Nacimiento, Distrito, Pensin);
END$$
DELIMITER ;

/* Sentencia SQL para grabar los Datos: */


CALL grabar_datos_alumnos (11, Rogelio, Matrix
Zero, Rosas, da@io.com, 1999-12-12, San juan,1111)

2.-Crear un procedimiento almacenado que


permita actualizar datos a la tabla ALUMNO.
/*Procedimiento almacenado para actualizar datos de la
tabla alumno*/
DELIMITER $$
CREATE
PROCEDURE `bdcolegio`.`ACTUALIZAR_DATOS_ALUMNOS`
(
pCdigo INT(5),

Nombre VARCHAR(30),
Apellido VARCHAR(35),
Direccin VARCHAR(75),
Email VARCHAR(45),
Fecha_Nacimiento DATE,
Distrito VARCHAR(70),
Pensin VARCHAR(15)
)
BEGIN
UPDATE alumno SET Nombre=Nombre, Apellido=Apellido,
Direccin=Direccin, Email=Email,
Fecha_Nacimiento=Fecha_Nacimiento, Distrito=Distrito,
Pensin=Pensin
WHERE Cdigo=pCdigo;
END$$
DELIMITER ;

/*Sentencia SQL para Actualizar datos de la tabla


alumno*/
CALL actualizar_datos_alumnos (10, Santos , Matrix
Resonancia , Rosas carcajadas,dario@ioman.com, 1999-1212, San Loreto, 9999)

3.- Crear un trigger que no permita grabar un


nombre y apellido que ya exista en la tabla
ALUMNO.
SELECT * FROM XT_RESPALDO_ALUMNO
CREATE TRIGGER GRABAR_NOT_APE_NOM
ON alumno FOR INSERT
AS
DECLARE
nom VARCHAR(30),
apellid VARCHAR(35)
SELECT
nom=Nombre
apellid=Apellido
FROM inserted
IF (SELECT COUNT(*) FROM alumno WHERE Nombre=nom AND
Apellido=apellid)>1
BEGIN

RaisError(Nombre, Apellido ya existe,0,1)


ROLLBACK TRANSACTION
END
Go

4.- Crear un trigger que no permita grabar si en


el campo de fecha de nacimiento se ingresa una
fecha mayor al ao 01/01/95
CREATE TRIGGER GRABAR
ON fecha FOR INSERTED
AS
DECLARE fecha DATE
SELECT fecha=mat_fecha from inserted
IF (select count (*) FROM matricula WHERE mat_fecha >
01/01/1995)
BEJN
RaisError (Fecha de matrcula es mayor a 01/01/1995)
ROLLBACK TRANSACTION
END
Go

Defensa

You might also like