Oracle_One-Alura_Latam/011_mysql/proyecto_scripts/funcs_sp.sql
2023-10-29 03:55:17 -03:00

152 lines
4.5 KiB
SQL

USE empresa;
/*
MySQL
SET GLOBAL log_bin_trust_function_creators = 1
*/
DROP FUNCTION IF EXISTS f_aleatorio;
DELIMITER $$
CREATE FUNCTION f_aleatorio(min INT, max INT)
RETURNS INT
BEGIN
DECLARE vresultado INT;
SELECT FLOOR(RAND() * (MAX-MIN+1)+MIN) INTO vresultado;
RETURN vresultado;
END $$
DELIMITER ;
DROP FUNCTION IF EXISTS f_cliente_aleatorio;
DELIMITER $$
CREATE FUNCTION f_cliente_aleatorio()
RETURNS VARCHAR(11)
BEGIN
DECLARE vresultado VARCHAR(11);
DECLARE vmax, vrand INT;
SELECT COUNT(*) INTO vmax FROM clientes;
SET vrand = f_aleatorio(1, vmax);
SET vrand = vrand-1;
SELECT dni INTO vresultado FROM clientes LIMIT vrand, 1;
RETURN vresultado;
END $$
DELIMITER ;
DROP FUNCTION IF EXISTS f_producto_aleatorio;
DELIMITER $$
CREATE FUNCTION f_producto_aleatorio()
RETURNS VARCHAR(11)
BEGIN
DECLARE vresultado VARCHAR(11);
DECLARE vmax, vrand INT;
SELECT COUNT(*) INTO vmax FROM productos;
SET vrand = f_aleatorio(1, vmax);
SET vrand = vrand-1;
SELECT codigo INTO vresultado FROM productos LIMIT vrand, 1;
RETURN vresultado;
END $$
DELIMITER ;
DROP FUNCTION IF EXISTS f_vendedor_aleatorio;
DELIMITER $$
CREATE FUNCTION f_vendedor_aleatorio()
RETURNS VARCHAR(11)
BEGIN
DECLARE vresultado VARCHAR(11);
DECLARE vmax, vrand INT;
SELECT COUNT(*) INTO vmax FROM vendedores;
SET vrand = f_aleatorio(1, vmax);
SET vrand = vrand-1;
SELECT matricula INTO vresultado FROM vendedores LIMIT vrand, 1;
RETURN vresultado;
END $$
DELIMITER ;
SELECT "Test Funciones aleatorias" AS '';
SELECT f_cliente_aleatorio() AS cliente,
f_producto_aleatorio() AS producto,
f_vendedor_aleatorio() AS vendedor;
DROP PROCEDURE IF EXISTS sp_venta;
DELIMITER $$
CREATE PROCEDURE sp_venta(fecha DATE, max_items INT, max_cantidad INT)
BEGIN
DECLARE vcliente VARCHAR(11);
DECLARE vproducto VARCHAR(10);
DECLARE vvendedor VARCHAR(5);
DECLARE vcantidad INT;
DECLARE vprecio FLOAT;
DECLARE vitems INT;
DECLARE vnfactura INT;
DECLARE vcontador INT DEFAULT 1;
DECLARE vitem_repetido INT;
SELECT MAX(numero)+1 INTO vnfactura FROM facturas;
SET vcliente = f_cliente_aleatorio();
SET vvendedor = f_vendedor_aleatorio();
INSERT INTO facturas (numero, fecha, dni, matricula, impuesto)
VALUES (vnfactura, fecha, vcliente, vvendedor, 0.16);
SET vitems = f_aleatorio(1, max_items);
WHILE vcontador <= vitems DO
SET vproducto = f_producto_aleatorio();
SET vcantidad = f_aleatorio(1,max_cantidad);
SELECT COUNT(*) INTO vitem_repetido FROM items
WHERE codigo = vproducto AND numero = vnfactura;
IF vitem_repetido = 0 THEN
SELECT precio INTO vprecio FROM productos WHERE codigo = vproducto;
INSERT INTO items(numero, codigo, cantidad, precio)
VALUES(vnfactura, vproducto, vcantidad, vprecio);
SET vcontador = vcontador+1;
ELSE
SELECT precio INTO vprecio FROM productos WHERE codigo = vproducto;
UPDATE items SET cantidad = ((SELECT cantidad FROM items
WHERE codigo=vproducto AND numero=vnfactura) + vcantidad)
WHERE codigo=vproducto AND numero=vnfactura;
SET vcontador = vcontador+1;
END IF;
END WHILE;
END $$
DELIMITER ;
/*
SP Venta Mentor
DELIMITER $$
CREATE PROCEDURE `sp_venta`(fecha DATE, maxitems INT, maxcantidad INT)
BEGIN
DECLARE vcliente VARCHAR(11);
DECLARE vproducto VARCHAR(10);
DECLARE vvendedor VARCHAR(5);
DECLARE vcantidad INT;
DECLARE vprecio FLOAT;
DECLARE vitens INT;
DECLARE vnfactura INT;
DECLARE vcontador INT DEFAULT 1;
DECLARE vnumitems INT;
SELECT MAX(NUMERO) + 1 INTO vnfactura FROM facturas;
SET vcliente = f_cliente_aleatorio();
SET vvendedor = f_vendedor_aleatorio();
INSERT INTO facturas (NUMERO, FECHA, DNI, MATRICULA, IMPUESTO)
VALUES (vnfactura, fecha, vcliente, vvendedor, 0.16);
SET vitens = f_aleatorio(1, maxitems);
WHILE vcontador <= vitens
DO
SET vproducto = f_producto_aleatorio();
SELECT COUNT(*) INTO vnumitems FROM items
WHERE CODIGO = vproducto AND NUMERO = vnfactura;
IF vnumitems = 0 THEN
SET vcantidad = f_aleatorio(1, maxcantidad);
SELECT PRECIO INTO vprecio FROM productos WHERE CODIGO = vproducto;
INSERT INTO items(NUMERO, CODIGO, CANTIDAD, PRECIO) VALUES(vnfactura, vproducto, vcantidad, vprecio);
END IF;
SET vcontador = vcontador+1;
END WHILE;
END $$
DELIMITER ;
*/