/*
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';