Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, comecei recentemente a trabalhar com stored procedures, transactions e loops no mysql (ou seja, estou apanhando bastante..). Preciso que uma stored procedure execute um select e itere sobre os elementos do mesmo; Para cada item selecionado será alterado um valor em outra tabela.
A aplicação é para o controle de estoque de uma loja virtual.
Segue o link no sqlfiddle com uma versão antiga da procedure e com o esquema de dados: http://sqlfiddle.com/#!2/7f66c/2
Segue o trecho que preciso fazer funcionar:
FOR
SELECT `produto` INTO @prod, `quantidade` INTO @qtd
FROM `dcoracoes_item`
WHERE `pedido` = cod_pedido
DO
UPDATE `dcoracoes_produto`
SET `estoque` = `estoque` - @qtd
WHERE `cod` = @prod;
UPDATE `dcoracoes_item`
SET `total` =
( SELECT `preco`
FROM `dcoracoes_produto`
WHERE `pedido` = cod_pedido AND `produto` = @prod
) ;
END FOR;
Segue a procedure inteira..
drop procedure if exists myProc;
DELIMITER //
CREATE PROCEDURE myProc(IN cod_pedido INT (11))
BEGIN
START TRANSACTION;
select `status` INTO @v_status
from dcoracoes_pedido
WHERE cod = cod_pedido;
IF @v_status = 'criado' THEN
FOR
SELECT `produto` INTO @prod, `quantidade` INTO @qtd
FROM `dcoracoes_item`
WHERE `pedido` = cod_pedido
DO
UPDATE `dcoracoes_produto`
SET `estoque` = `estoque` - @qtd
WHERE `cod` = @prod;
UPDATE `dcoracoes_item`
SET `total` =
( SELECT `preco`
FROM `dcoracoes_produto`
WHERE `pedido` = cod_pedido AND `produto` = @prod
) ;
END FOR;
UPDATE `dcoracoes_pedido`
SET `data` = NOW(), `total` = ( SELECT SUM(`total` * `quantidade`) FROM `dcoracoes_item` WHERE `pedido` = cod_pedido)
WHERE `cod` = cod_pedido ;
END IF;
SELECT estoque INTO @total
FROM `dcoracoes_produto`
WHERE estoque < 0;
IF (@total >= 0) THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
SET AUTOCOMMIT=1;
END; //
DELIMITER ;
call myProc(1);
Agradeço pela paciência de você ter lido por aqui! :natalbiggrin:Carregando comentários...