Jump to content
Fórum Script Brasil
  • 0

procedure mysql na trigger


Daniel Rocha
 Share

Question

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;
************************

 

 

 

 

Edited by Daniel Rocha
Link to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.2k
×
×
  • Create New...