1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
/* Ejercicio 18: Escribir un procedimiento que reciba todos los datos de un nuevo empleado y procese la transacción de alta gestionando posibles errores. */ delimiter $$ drop procedure if exists 1x18 $$ create procedure 1x18( ape tinytext, ofi tinytext, dir int, sal double, com int, dep int ) begin declare correcto boolean default true; declare error varchar(100) default 'Errores en: '; -- El apellido, en este caso..., no puede estar repetido, no puede ser nulo y tampoco vacio: if (select apellido from empleados where apellido like ape) = ape || ape is null || ape like '' then set error = concat(error,'apellido, '); set correcto = false; end if; -- El oficio no puede ser nulo ni vacio: if ofi is null || ofi like '' then set error = concat(error,'oficio, '); set correcto = false; end if; -- Se debe de tener un director o no nulo: if dir not in( select director from empleados where director = dir ) then set error = concat(error,'director, '); set correcto = false; end if; -- El salario no puede ser negativo ni cero ni nulo: if sal <= 0 || sal is null then set error = concat(error,'salario, '); set correcto = false; end if; -- Si la comision es negativo: if com < 0 then set error = concat(error,'complemento, '); set correcto = false; end if; -- El departamento debe de existir: if dep not in (select dep_no from departamentos) then set error = concat(error,'departamento.'); set correcto = false; end if; -- Si todo es correcto se inserta el empleado, si no se muestra el resultado: if correcto = true then select max(emp_no)+1 into @max from empleados; insert into empleados values( @max, ape, ofi, dir, sysdate(), sal, com, dep ); set @max = null; else select error as 'Resultado'; end if; end $$ delimiter ; -- call 1x18( 'ZARZA', 'VENDEDOR', 7839, 1400, 75, 30 ); |