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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
/* Ejercicio 27: Realizar un procedimiento que actualice el salario de los empleados, con una cantidad por hijo que se pase al procedimiento, para aquellos trabajadores que su comisión es nula. Durante el proceso de actualización debe garantizarse que ningún otro usuario pueda cambiar los datos que están siendo modificados. Utilizar un manejador de tipo SQLEXCEPTION (que incluya la operación ROLLBACK) para tratar cualquier situación de error distinta de la excepción NOT FOUND que también deberá manejarse. Al final del proceso, confirmar la transacción si la ejecución ha sido correcta. Ejemplo de funcionamiento. Antes de llamar al procedimiento de actualización: +-------+---------+----------+-------+ | numem | salario | comision | numhi | +-------+---------+----------+-------+ | 110 | 310 | NULL | 3 | | 120 | 350 | 110 | 1 | | 130 | 290 | 110 | 2 | | 150 | 440 | NULL | 0 | | 160 | 310 | 110 | 2 | | 180 | 480 | 50 | 2 | | 190 | 300 | NULL | 4 | … …. Después de ejecutar CALL EJERCICIO3_1(30); +-------+---------+----------+-------+ | numem | salario | comision | numhi | +-------+---------+----------+-------+ | 110 | 400 | NULL | 3 | | 120 | 350 | 110 | 1 | | 130 | 290 | 110 | 2 | | 150 | 440 | NULL | 0 | | 160 | 310 | 110 | 2 | | 180 | 480 | 50 | 2 | | 190 | 420 | NULL | 4 | ... ... */ delimiter $$ drop procedure if exists 1x27 $$ create procedure 1x27(prima int) begin declare v_numem integer; declare finCursor boolean default false; declare c_cursor cursor for select numem from empleados where comision is null and numhi > 0 for update; declare continue handler for not found set finCursor = true; declare exit handler for sqlexception begin rollback; select "Ocurrio un error"; end; START TRANSACTION; open c_cursor; fetch c_cursor into v_numem; while finCursor = false do update empleados set salario = salario + (prima * numhi) where numem = v_numem; fetch c_cursor into v_numem; end while; close c_cursor; commit; end $$ delimiter ; -- select numem, salario, comision, numhi from empleados; -- call 1x27(30); -- select numem, salario, comision, numhi from empleados; |