FILR@N 0 Denunciar post Postado Julho 1, 2009 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
FILR@N 0 Denunciar post Postado Julho 3, 2009 Poxa... ningeum poria me ajudar ? To precisando muito resolver isso... Por favor ! Compartilhar este post Link para o post Compartilhar em outros sites
Wagner Bianchi 0 Denunciar post Postado Julho 3, 2009 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
FILR@N 0 Denunciar post Postado Julho 6, 2009 Olá Wagner Bianchi ! Obrigado pela sua ajuda mas, ainda continua dar erro. Quando eu vou inserir os dados aparece isso. 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
Wagner Bianchi 0 Denunciar post Postado Julho 6, 2009 Você está utilizando MyISAM para a tabela alvo do INSERT que dispara o TRIGGER? :rolleyes: Compartilhar este post Link para o post Compartilhar em outros sites
FILR@N 0 Denunciar post Postado Julho 6, 2009 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
Wagner Bianchi 0 Denunciar post Postado Julho 6, 2009 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
FILR@N 0 Denunciar post Postado Julho 7, 2009 ferrou! E agora ? Compartilhar este post Link para o post Compartilhar em outros sites
FILR@N 0 Denunciar post Postado Julho 7, 2009 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
Wagner Bianchi 0 Denunciar post Postado Julho 7, 2009 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
FILR@N 0 Denunciar post Postado Julho 7, 2009 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