Ir para conteúdo

Arquivado

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

FILR@N

Select x Variável não dá certo na Trigger

Recommended Posts

Fala galera !

 

Estou com a seguinte trigger que me retorna isso: "Not allowed to return a result set from a trigger".

delimiter |

CREATE TRIGGER cria_codprocesso2 AFTER INSERT ON alunos
  FOR EACH ROW BEGIN

	/*Seleciona o ultimo aluno e retorna o seu ID*/
	SELECT @idaluno:=idaluno FROM alunos ORDER BY idaluno DESC LIMIT 0,1;

	/*Cria o cod. processo do ultimo aluno*/
	SELECT @codprocesso:=CONCAT(idaluno,".",idcurso,".",idprocesso,".",YEAR(NOW()))
	  FROM alunos ORDER BY idaluno DESC LIMIT 0,1;

	/*Grava o campo cadprocesso*/
	UPDATE alunos
	SET codprocesso = @codprocesso
	WHERE idaluno = @idaluno;

  END;
|

Se eu rodar o código sem ser como trigger vai.

O que está acontecendo?

 

Agradeço quem ajudar!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em uma TRIGGER não é permitida nenhuma saída de qualquer resultado.

Como você tem um SELECT para setar o valor da variável @codprocesso, ele está reclamando.

Uma solução seria, ao invés de você efetuar o SELECT para setar um valor para a user variable, declarar uma variável e setar o valor dela com INTO:

 

mysql> delimiter //
mysql> create trigger trg_test
	-> after insert
	-> on t100
	-> for each row
	-> begin
	->   declare a int default 0;   -- variável declarada
	->   select NEW.id INTO a;	-- valor setado com INTO
	->   update t100 set id =a;
	-> end;;
	-> //
Query OK, 0 rows affected (0.05 sec)

Utilizando o INTO, o SELECT não retornará para o meio externo um valor, o que possibilita que o TRIGGER seja criado.

Na sua TRIGGER você terá que criar duas variáveis, idade e codprocesso.

 

Happy MySQL'ing! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Wagner Bianchi !

 

Obrigado pela sua ajuda mas, ainda continua dar erro. Quando eu vou inserir os dados aparece isso.

 

Imagem Postada

 

delimiter |

CREATE TRIGGER cria_codprocesso AFTER INSERT ON alunos
  FOR EACH ROW BEGIN

  DECLARE vidaluno INT DEFAULT 0;
  DECLARE vcodprocesso VARCHAR(45) DEFAULT "";

  SELECT NEW.idaluno INTO vidaluno;
  SELECT CONCAT( NEW.idaluno,".",NEW.idcurso,".",NEW.idprocesso,".",YEAR(NOW()) ) INTO vcodprocesso;

  UPDATE alunos SET codprocesso=vcodprocesso WHERE idaluno=vidaluno;

  END;
|

 

O que pode ser ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

não... a tabela é InnoDB, Charset latin1 e Collation latin1_swedish_ci.

 

Obs: os campos idcurso e idprcesso nao estao como chaves estrangeiras pois esta tabela é d teste q simula outra q tera chave.

Compartilhar este post


Link para o post
Compartilhar em outros sites

DEADLOCK! http://forum.imasters.com.br/public/style_emoticons/default/pinch.gif

 

Seguinte, o TRIGGER é parte da transação, ou seja, o que acontece no TRIGGER ainda é parte da transação do INSERT.

Como a transação ainda não terminou, como você quer fazer um UPDATE em uma linha que ainda está bloqueada pelo INSERT?

 

PAU!

 

Happy MySQL'ing! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho que não é isso. Eu testei pra fazer a mesma coisa mas, sendo com a primeira linha, ou seja, linha que já foi salva, e deu o mesmo erro.

 

delimiter |

CREATE TRIGGER cria_codprocesso BEFORE INSERT ON alunos
  FOR EACH ROW BEGIN

  DECLARE vidaluno INT DEFAULT 0;
  DECLARE vidcurso INT DEFAULT 0;
  DECLARE vidprocesso INT DEFAULT 0;
  DECLARE vcodprocesso VARCHAR(45) DEFAULT "";

  SELECT idaluno FROM alunos ORDER BY idaluno ASC LIMIT 0,1 INTO vidaluno;
  SELECT idcurso FROM alunos ORDER BY idcurso ASC LIMIT 0,1 INTO vidcurso;
  SELECT idprocesso FROM alunos ORDER BY idprocesso ASC LIMIT 0,1 INTO vidprocesso;
  SELECT CONCAT( vidaluno,".",vidcurso,".",vidprocesso,".",YEAR(NOW()) ) INTO vcodprocesso;

  UPDATE alunos SET codprocesso=vcodprocesso WHERE idaluno=vidaluno;

  END;
|

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu testei pra fazer a mesma coisa mas, sendo com a primeira linha, ou seja, linha que já foi salva, e deu o mesmo erro.

Como que você testou para uma linha já presente na tabela se sua TRIGGER somente é disparada com um INSERT?

Outra, por que você mudou a TRIGGER para BEFORE INSERT agora?

 

CREATE TRIGGER cria_codprocesso BEFORE INSERT

O problema da primeira TRIGGER é realmente de DEADLOCK.

 

Não entendi nada agora, se precisar de ajuda, continue postando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu troquei para BEFORE somente para testar.

 

Wagner, vou lhe explicar o que eu quero realmente. Às vezes assim ficará mais claro.

 

Numa determinada tabela, quero que quando for inserido um novo registro, seja gravado no campo "codprocesso" a concatenação dos campos "idaluno"."idcurso"."id.processo".YEAR(NOW()) deste mesmo registro e que seja feita por uma TRIGGER.

 

Pergunta.

 

Como fazer ?

 

Agradeço desde já a cooperação.

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.