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 |
/* Examen de prueba: Pregunta 1 Realiza un procedimiento pregunta1 que a partir de un código de artículo y una cantidad disminuya las existencias de la tabla artículos de ese artículo en esa cantidad. Utiliza un tercer argumento de tipo out para indicar el resultado del procedimiento Ten en cuenta: - Si el artículo no existe entonces el tercer argumento devolverá -1. - Si el artículo existe pero no hay suficientes unidades del mismo, el tercer argumento devolverá -2 En los 2 casos anteriores no se llevará a cabo ninguna modificación de las existencias. Si el artículo existe y dispone de existencias suficientes, realizar la operación y validar los cambios. Utiliza transacciones. Durante el tiempo que dure el proceso de modificación, se reservará (bloqueará) la fila implicada hasta que se validen los cambios. El tercer argumento devolverá 1. Para cualquier situación de error que se pueda producir se actuará deshaciendo la operación y devolviendo un 0 en el tercer argumento del procedimiento. */ delimiter $$ drop procedure if exists 2x01 $$ create procedure 2x01( p_articulo char(4), p_cantidad int(11), out p_resultado int(1) ) begin declare v_cod_articulo char(4); declare v_existencias int(11); declare continue handler for sqlexception begin rollback; set p_resultado = 0; end; -- El articulo existe y hay suficientes existencias: if ( select true from articulos where cod_articulo = p_articulo and existencias >= p_cantidad ) then select cod_articulo, existencias into v_cod_articulo, v_existencias from articulos where cod_articulo = p_articulo for update; START TRANSACTION; update articulos set existencias = existencias - p_cantidad where cod_articulo = v_cod_articulo and existencias = v_existencias; set p_resultado = 1; commit; -- El articulo existe pero no hay existencias suficientes: elseif ( select true from articulos where cod_articulo = p_articulo ) then set p_resultado = -2; -- El articulo no existe: else set p_resultado = -1; end if; end $$ delimiter ; -- call 2x01( 'A001', 3, @resultado ); -- select @resultado as 'Resultado'; |