Ir para conteúdo
Fórum Script Brasil
  • 0

procedure mysql na trigger


Daniel Rocha

Pergunta

sou novo em mysql, estou criando uma stored procedure.  e tendo chamar ela na tringger só que da erro 

CREATE DEFINER=`root`@`localhost` PROCEDURE `cnh_testes`( in v_veiculo int, in v_data_reserva date,in v_hora_reserva time,
in v_previsao_volta date,in v_previsao_hora time,in v_destino int,in v_obs varchar(255),in v_condutor_id int)
BEGIN

declare v_validacnh INT;
select c.id_condutor into v_validacnh from condutor c
     inner join veiculo v on v.Id_cnh = c.id_cnh
        where c.vencimento_cnh <= current_date()  and c.id_condutor = c.id_condutor;

if v_validacnh = v_condutor_id then
   rollback;
         SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'CNH VENCIDA OU CNH NÃO PERMITIDA PARA ESSE VEICULO';
else
insert INTO RESERVA (veiculo,data_reserva,hora_reserva,previsao_volta,previsao_hora,destino,obs,condutor_id )
           values(v_veiculo,v_data_reserva,v_hora_reserva,v_previsao_volta,v_previsao_hora,v_destino,v_obs,v_condutor_id );                
end if;

END

*********aqui chamo ela na trigger************
CREATE DEFINER=`root`@`localhost` TRIGGER `testecarros`.`teste_BEFORE_INSERT` BEFORE INSERT ON `reserva` FOR EACH ROW
BEGIN
call cnh_testes (new.veiculo,new.data_reserva,new.hora_reserva,new.previsao_volta,new.previsao_hora,new.destino,new.obs,new.condutor_id );
END

***************erro que me retorna quando faço a inserção**********************************************

Not allowed to returna result set a tringger

 

como resolvo isto?

 

*******************************************************************

assim quero fazer essa validação no banco - (ai eu valido se a cnh esta vencida antes de inseri)

(antes de fazer  (inseri )quero  validar algumas situações )

1-  se o condutor esta com a cnh vencida- que é a procedure acima

2-  se o condutor pode dirigir o veiculo - se cnh do condutor e igual ou maior veiculo do 

3-  condutor não pode fazer reserva se o veiculo estiver reservado naquele horário ou entre hora de retorno 

tenho essa tabelas 

CREATE TABLE `cnh` (
  `Id_cnh` int(11) NOT NULL AUTO_INCREMENT,
  `cnh_nome` char(2) DEFAULT NULL,
  PRIMARY KEY (`Id_cnh`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

************************
CREATE TABLE `cidade` (
  `id_cidade` int(11) NOT NULL AUTO_INCREMENT,
  `Cidade` varchar(50) DEFAULT NULL,
  `uf` int(11) DEFAULT NULL,
  PRIMARY KEY (`id_cidade`),
  KEY `uf` (`uf`),
  CONSTRAINT `cidade_ibfk_1` FOREIGN KEY (`uf`) REFERENCES `uf` (`id_uf`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;
************************
CREATE TABLE `condutor` (
  `id_condutor` int(11) NOT NULL AUTO_INCREMENT,
  `nome_condutor` varchar(80) DEFAULT NULL,
  `id_departamento` int(11) DEFAULT NULL,
  `vencimento_cnh` date DEFAULT NULL,
  `telefone` varchar(11) DEFAULT NULL,
  `emai` varchar(80) DEFAULT NULL,
  `id_cnh` int(11) DEFAULT NULL,
  PRIMARY KEY (`id_condutor`),
  KEY `id_departamento` (`id_departamento`),
  KEY `id_cnh` (`id_cnh`),
  CONSTRAINT `condutor_ibfk_1` FOREIGN KEY (`id_departamento`) REFERENCES `departamento` (`id_departamento`),
  CONSTRAINT `condutor_ibfk_2` FOREIGN KEY (`id_cnh`) REFERENCES `cnh` (`Id_cnh`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
************************
CREATE TABLE `veiculo` (
  `id_veiculo` int(11) NOT NULL AUTO_INCREMENT,
  `tipo_veiculo` int(11) DEFAULT NULL,
  `placa` char(7) DEFAULT NULL,
  `cor` varchar(20) DEFAULT NULL,
  `km_veiculo_inical` int(11) DEFAULT NULL,
  `id_cnh` int(11) DEFAULT NULL,
  PRIMARY KEY (`id_veiculo`),
  KEY `tipo_veiculo` (`tipo_veiculo`),
  KEY `id_cnh` (`id_cnh`),
  CONSTRAINT `veiculo_ibfk_1` FOREIGN KEY (`tipo_veiculo`) REFERENCES `tipoveiculo` (`id_tipoveiculo`),
  CONSTRAINT `veiculo_ibfk_2` FOREIGN KEY (`id_cnh`) REFERENCES `cnh` (`Id_cnh`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=latin1;
************************
CREATE TABLE `reserva` (
  `id_reseva` int(11) NOT NULL AUTO_INCREMENT,
  `veiculo` int(11) DEFAULT NULL,
  `data_reserva` date DEFAULT NULL,
  `hora_reserva` time DEFAULT NULL,
  `previsao_volta` date DEFAULT NULL,
  `previsao_hora` time DEFAULT NULL,
  `destino` int(11) DEFAULT NULL,
  `cancela` char(1) DEFAULT NULL,
  `baixar_reserva` int(11) DEFAULT NULL,
  `obs` varchar(255) DEFAULT NULL,
  `condutor_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id_reseva`),
  KEY `veiculo` (`veiculo`),
  KEY `destino` (`destino`),
  KEY `baixar_reserva` (`baixar_reserva`),
  KEY `condutor_id` (`condutor_id`),
  CONSTRAINT `reserva_ibfk_1` FOREIGN KEY (`veiculo`) REFERENCES `veiculo` (`id_veiculo`),
  CONSTRAINT `reserva_ibfk_2` FOREIGN KEY (`destino`) REFERENCES `cidade` (`id_cidade`),
  CONSTRAINT `reserva_ibfk_3` FOREIGN KEY (`baixar_reserva`) REFERENCES `tipobaixa` (`id_tipo_baixa`),
  CONSTRAINT `reserva_ibfk_4` FOREIGN KEY (`condutor_id`) REFERENCES `condutor` (`id_condutor`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
************************

 

 

 

 

Editado por Daniel Rocha
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

O MySQL não permite este tipo de validação.

A solução que adotei em meus sistemas foi realizar toda e qualquer gravação através de procedures, que podem retornar um result set de um select.

Veja abaixo um exemplo:

DELIMITER $$

USE `meudatabase`$$

DROP PROCEDURE IF EXISTS `exemplo_crud`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `exemplo_crud`(IN Acao CHAR(1), IN pidExemplo INTEGER, 
   IN pnmExemplo VARCHAR(50), IN ptxExemplo DOUBLE(6,3), IN pvlMinimo DOUBLE(8,2), IN pndExemplo CHAR(1), 
   IN pidDominioSituacao INTEGER)
BEGIN
   DECLARE msg VARCHAR(1000) DEFAULT "sem mensagem";
   DECLARE excecao SMALLINT DEFAULT ;
   DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1;
   IF pnmExemplo = "" OR (Acao <> "I" AND pidExemplo = ) THEN
      SET msg = "Erro na passagem de parametros";
   ELSE
      START TRANSACTION;
      /*Inclusao */
      IF Acao = "I" THEN
         INSERT INTO exemplo(nmExemplo, txExemplo, vlMinimo, ndExemplo, idDominioSituacao)
         VALUES (pnmExemplo, ptxExemplo, pvlMinimo, pndExemplo, pidDominioSituacao);
         IF excecao = 1 THEN
            SET msg = "MySQL: Erro ao inserir na tabela de exemplo";
            ROLLBACK;
         END IF;
      END IF;
   
      IF excecao <> 1 THEN
         IF Acao <> "I" THEN
            SET @idExemplo = pidExemplo;
         END IF;
         /*Alteracao*/
         IF Acao = "A" THEN
            UPDATE exemplo
            SET nmExemplo = pnmExemplo,
                txExemplo = ptxExemplo, 
                vlMinimo = pvlMinimo, 
                ndExemplo = pndExemplo,  
                idDominioSituacao = pidDominioSituacao
            WHERE idExemplo = @idExemplo;
            IF excecao = 1 THEN
               SET msg = "MySQL: Erro ao atualizar exemplo";
               ROLLBACK;
            END IF;
         END IF;
      END IF;
      /*Exclusao*/
      IF excecao <> 1 THEN
         IF Acao = "E" THEN
            DELETE FROM exemplo
            WHERE idExemplo = @idExemplo;
            IF excecao = 1 THEN
               SET msg = "MySQL: Erro ao excluir exemplo";
               ROLLBACK;
            END IF;
         END IF;
      END IF;
        
      /*Se tudo deu certo, então finaliza confirmando a gravacao.*/
      IF excecao <> 1 THEN
         COMMIT;
         IF Acao = "I" THEN
            SET msg = "MySQL: Exemplo Incluido com sucesso";
         ELSE
            IF Acao = "A" THEN
               SET msg = "MySQL: Exemplo Alterado com sucesso";
            ELSE
               SET msg = "MySQL: Exemplo Excluido com sucesso";
            END IF;
         END IF;
      END IF;
   END IF;
   SELECT msg AS msg;
END$$

DELIMITER ;

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...