Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Danne Makleyston

Trigger com várias inserções utilizando variáveis e comando de repetiç

Recommended Posts

Boa noite galera..
Estou com um problema que já está me tirando do sério.
Desejo criar uma trigger que deverá inserir vários registros em uma tabela com base em uma outra, rsrs..
Em outras palavras é o seguinte: Tenho uma tabela que ao ser inserido um registro nela, ela vai consultar uma outra tabela, e se houver registro nessa consulta, a trigger deve inserir em uma terceira tabela um registro para cada registro presente na segunda.

Segue uma tentativa de construir o código:

DELIMITER $$


CREATE TRIGGER tgr_insertPriceProduct BEFORE INSERT
ON precoprodutos FOR EACH ROW
BEGIN
SELECT count(*) INTO @verificador FROM produtos WHERE idRepresentada = NEW.idRepresentada;
SET @i = 0;
WHILE (@i < @verificador) DO
BEGIN
SELECT idProduto,
preco INTO
@idProduto,
@preco FROM produto ORDER BY idProduto LIMITE @i,@i+1;
INSERT INTO valoresprecosproduto (valorPrecoProduto, idPrecoProduto, idproduto) VALUES (@preco+5, NEW.idPrecoProduto, @idProduto);
SET @i := @i+1;
END;
END$$

DELIMITER ;

 

Erro: Ocorre o erro de sintaxe.

 

Estou desde já grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não conheço síntaxe de MySql, mas :

 

1 Publique o erro ocorrido

 

2 Creio que o select count é desnecessário pois a presença de registros no select do cursor já faria isto, sem dados localizados sem insert pois o cursor estaria vazio.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta o erro que aparece é o seguinte:

 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMITE @i,@i+1;
INSERT INTO valoresprecosproduto (valorPrecoProduto, idPr' at line 11

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei a solução..

Vou postar aqui, pois alguém pode precisar no futuro.

 

1°: A sintaxe no 'WHILE' está errada. O correto é: WHILE () DO ... END WHILE;

2°: Não se aplica variável no LIMIT de um SELECT (Sem contar que eu escrevi no código 'LIMITE' e não 'LIMIT'). E para resolver a questão do 'limit' que era essencial tive que fazer uma 'gambiarra' no mysql. Foi necessário criar FUNCTIONs, pois eles retornam valores, que após isso, posso armazenar em variáveis. As functions permitem passar valores por parametros e assim o LIMIT aceita os parametros.

3°: A lógica de informar qual registro eu queria no LIMIT foi alterada para melhor funcionamento do algoritmo;

 

Segue o código alterado e funcionando.. (Uffaaaaaaaaa):

 

DROP FUNCTION IF EXISTS fc_idProdutoProduto;
CREATE FUNCTION fc_idProdutoProduto (idRep int, inicio int, qt int) RETURNS int
DETERMINISTIC
BEGIN
DECLARE id int;
SELECT idProduto INTO id FROM produtos WHERE idRepresentada = idRep LIMIT inicio, qt;
RETURN id;
END;
DROP FUNCTION IF EXISTS fc_precoProduto;
CREATE FUNCTION fc_precoProduto (idRep int, inicio int, qt int) RETURNS float
DETERMINISTIC
BEGIN
DECLARE valor float;
SELECT preco INTO valor FROM produtos WHERE idRepresentada = idRep LIMIT inicio, qt;
RETURN valor;
END;
DROP TRIGGER IF EXISTS tgr_insertPriceProduct;
DELIMITER $$
CREATE TRIGGER tgr_insertPriceProduct AFTER INSERT
ON precoprodutos FOR EACH ROW
BEGIN
DECLARE id int;
DECLARE valor float;
SELECT count(*) INTO @verificador FROM produtos WHERE idRepresentada = NEW.idRepresentada;
WHILE (@verificador >= 0) DO
SELECT fc_idProdutoProduto(NEW.idRepresentada,@verificador,1) INTO id;
SELECT fc_precoProduto(NEW.idRepresentada,@verificador,1) INTO valor;
IF ((id) AND (valor)) THEN
INSERT INTO valoresprecosproduto (valorPrecoProduto, idPrecoProduto, idproduto) VALUES (valor, NEW.idPrecoProduto, id);
END IF;
SET @verificador = @verificador - 1;
END WHILE;
END$$
DELIMITER ;
Obs.: Outra coisa que achei interessante é que se eu não colocasse este IF verificando se é Verdadeiro os valors de ID e VALOR o SQL é mais rápido e passa por ele informando o valor NULL. Então este verificado serve como um stop até que ele realmente esteja com os valores carregados.
Abraços awe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.