Blogs Media: CSS Mania | VivirLatino | Sentido Web | Apps Mania

Publicidad

Mié20Jun2007

Laboratorio: triggers y procedimientos almacenados en MySQL

16:00 H (CET)| Temas: Laboratorio · MYSQL

Unas opciones no muy usadas cuando se trabaja con MySQL son los triggers y los procedimientos almacenados (stored procedures), supongo que a que es algo nuevo en MySQL y la gente no está acostumbrada a estas dos funcionalidades.

Vamos a mostrar un ejemplo de uso de triggers y procedimientos almacenados paso a paso. Quizás el ejemplo no sea el más correcto, o simplemente sea poco útil, pero lo importante es el uso en sí, no el ejemplo.

Nuestro sistema tendrá dos tablas, una con ventas y la otra con comisiones. En la primera se almacenarán cada venta que se realiza en un comercio, y en la segunda las comisiones que le corresponden a cada vendedor en el momento.

CREATE TABLE `ventas` (
  `vendedor` int(11),
  `producto` int(11),
  `importe` float
)

CREATE TABLE `comisiones` (
  `vendedor` int(11),
  `comision` float
)

Las comisiones se calcula de una forma especial, le corresponde un porcentaje de las ventas según el tipo de producto, y es importante para los vendedores el que se sepa en cada momento qué comisiones lleva ganadas (esto es una justificación para no usar un cron o algo parecido).

Para calcular qué comisión le corresponde a un vendedor, calcularemos los porcentajes para cada tipo de producto vendido y luego lo añadiremos/actualizaremos en la tabla de comisiones. Todo se realizará en un procedimiento almacenado.

DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`sp_comisiones`$$

CREATE PROCEDURE `test`.`sp_comisiones` (IN mivendedor INT)
BEGIN
	DECLARE micomision INT DEFAULT 0;
	DECLARE suma INT;
	DECLARE existe BOOL;

	select IFNULL(sum(importe),0) into suma from ventas where producto = 1 and vendedor = mivendedor;
	SET micomision = micomision + (suma * 0.15);

	select IFNULL(sum(importe),0) into suma from ventas where producto = 2 and vendedor = mivendedor;
	SET micomision = micomision + (suma * 0.1);

	select IFNULL(sum(importe),0) into suma from ventas where producto = 3 and vendedor = mivendedor;
	SET micomision = micomision + (suma * 0.2);

	select count(1)>0 into existe from comisiones where vendedor = mivendedor;
	if existe then
		UPDATE comisiones set comision = comision+micomision where vendedor = mivendedor;
	else
		insert into comisiones (vendedor, comision) values (mivendedor, micomision);
	end if;
END$$

DELIMITER ;

Ahora, para actualizar los datos de las comisiones usaremos un trigguer, así cuando se haga una venta (insert en la tabla ventas), se llamará al procedimiento almacenado (sp_comisiones), que recalculará la comisión para ese vendedor.

DELIMITER $$

DROP TRIGGER `test`.`tr_ventas_insert`$$

CREATE TRIGGER `test`.`tr_ventas_insert` AFTER INSERT on `test`.`ventas`
FOR EACH ROW BEGIN
	call sp_comisiones(new.vendedor);
END$$

DELIMITER ;

Relacionados

Sin comentar » Formulario

Conversación

Nombre:

Email:

(no aparecerá)

URL:

(opcional)
¿Recordar datos?

↓ Comentarios (XHTML permitido)