Fórum Procedure MYSQL Desesperado #595213
30/06/2018
0
Alias a ideia da procedure é analisar se a viatura e o motorista e o horário estão disponíveis para cadastrar uma nova viagem, se não estiverem, volta um ERRO se estiverem liberado fazemos o INSERTna tabela.
CREATE PROCEDURE ADICIONAR_VIAGEM99( IN pIDVIAGENS INT , IN pCIDADE VARCHAR(25) , IN pDATAHORAINICIO DATETIME , IN pDATAHORAFINAL DATETIME , IN pCOR VARCHAR(15) , IN pCEP CHAR(9) , IN pRUA VARCHAR(30), IN pNUMERO VARCHAR(8) , IN pBAIRRO VARCHAR(25) , IN pESTADO CHAR(2) , IN pDESCRICAO VARCHAR(200), IN pID_DADOSPESSOAS INT, IN pID_MOTORISTA INT, IN pID_VIATURA INT ) BEGIN DECLARE DisponibilidadeViatura INT; DECLARE DisponibilidadeMotorista INT; if exists (Select * from VIAGENS where ID_VIATURA = pID_VIATURA AND pDATAHORAINICIO between DATAHORAINICIO and DATAHORAFINAL ) then set DisponibilidadeViatura = 0 else then set DisponibilidadeViatura = 1 if exists (Select * from VIAGENS where ID_MOTORISTA = pID_MOTORISTA AND pDATAHORAINICIO between DATAHORAINICIO and DATAHORAFINAL ) set DisponibilidadeMotorista = 0 else set DisponibilidadeMotorista = 1 if (DisponibilidadeViatura = 1 and DisponibilidadeMotorista = 1) INSERT INTO VIAGENS (IDVIAGENS, CIDADE, DATAHORAINICIO, DATAHORAFINAL, COR, CEP, RUA, NUMERO, BAIRRO, ESTADO, DESCRICAO, ID_DADOSPESSOAS, ID_MOTORISTA, ID_VIATURA) VALUES (NULL,pCIDADE, pDATAHORAINICIO, pDATAHORAFINAL, pCOR, pCEP, pRUA, pNUMERO, pBAIRRO, pESTADO, pDESCRICAO, pID_DADOSPESSOAS, pID_MOTORISTA, pID_VIATURA); else Select 'Motorista ou Viatura indisponível na data/hora selecionada.' as 'Error'; END $
e esse é o erro
ERROR 1064 (42000): 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 'else then set DisponibilidadeViatura = 1 if exists (Select * from VIAGENS where' at line 24 mysql>
Maurício Kalfelz
Curtir tópico
+ 0Post mais votado
01/07/2018
No Postgres a sintaxe da Procedure fica da seguinte maneira:
CREATE OR REPLACE PROCEDURE ADICIONA_VIAGEM(
pIDVIAGENS INT ,
pCIDADE VARCHAR(25) ,
pDATAHORAINICIO DATETIME ,
IpDATAHORAFINAL DATETIME ,
pCOR VARCHAR(15) ,
pCEP CHAR(9) ,
pRUA VARCHAR(30),
pNUMERO VARCHAR(8) ,
pBAIRRO VARCHAR(25) ,
pESTADO CHAR(2) ,
pDESCRICAO VARCHAR(200),
pID_DADOSPESSOAS INT,
pID_MOTORISTA INT,
pID_VIATURA INT
) RETURNS TEXT AS $$
DECLARE
retorno viagem%ROWTYPE;
BEGIN
SELECT INTO retorno from VIAGENS where ID_VIATURA = pID_VIATURA AND pDATAHORAINICIO between DATAHORAINICIO and DATAHORAFINAL;
IF NOT FOUND THEN
INSERT INTO VIAGENS (IDVIAGENS, CIDADE, DATAHORAINICIO, DATAHORAFINAL, COR, CEP, RUA, NUMERO, BAIRRO, ESTADO, DESCRICAO, ID_DADOSPESSOAS, ID_MOTORISTA, ID_VIATURA)
VALUES (NULL,pCIDADE, pDATAHORAINICIO, pDATAHORAFINAL, pCOR, pCEP, pRUA, pNUMERO, pBAIRRO, pESTADO, pDESCRICAO, pID_DADOSPESSOAS, pID_MOTORISTA, pID_VIATURA);
RETURN 'select teve retorno null então executou o insert';
ELSE THEN
RETURN 'select retornou tuplas e por isso não executou o insert'
END IF;
END;
$$LANGUAGE 'plpgsql';De uma olhada na sintaxe de procedure do MySQL, acredito que não deve ficar longe do Postgres
Kleber Santos
Gostei + 1
Mais Posts
01/07/2018
Kleber Santos
tentou colocar ;(ponto e virgula) no final da linha 23?
Por exemplo:
then set DisponibilidadeViatura = 0;
else
then set DisponibilidadeViatura = 1;Gostei + 1
01/07/2018
Maurício Kalfelz
tentou colocar ;(ponto e virgula) no final da linha 23?
Por exemplo:
then set DisponibilidadeViatura = 0;
else
then set DisponibilidadeViatura = 1;tentei sim amigo e aparece o seguinte erro
ERROR 1064 (42000): 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 'then set DisponibilidadeViatura = 1; if exists (Select * from VIAGENS where ID_' at line 25
Gostei + 0
01/07/2018
Kleber Santos
Tente dar uma pesquisada na sintaxe das procedures do MySQL principalmente em Estruturas Condicionais
Tem material aki na DevMedia mesmo:
https://www.devmedia.com.br/stored-procedures-no-mysql-5-estruturas-condicionais-e-exemplo-pratico-no-vb-net/5085
https://www.devmedia.com.br/stored-procedures-no-mysql/29030
Sugiro também modificar essa lógica, usar da seguinte forma:
if exists (Select * from VIAGENS where ID_VIATURA = pID_VIATURA AND pDATAHORAINICIO between DATAHORAINICIO and DATAHORAFINAL ) then Select 'Motorista ou Viatura indisponível na data/hora selecionada.' as 'Error'; else if exists (Select * from VIAGENS where ID_MOTORISTA = pID_MOTORISTA AND pDATAHORAINICIO between DATAHORAINICIO and DATAHORAFINAL ) then Select 'Motorista ou Viatura indisponível na data/hora selecionada.' as 'Error'; else INSERT INTO VIAGENS (IDVIAGENS, CIDADE, DATAHORAINICIO, DATAHORAFINAL, COR, CEP, RUA, NUMERO, BAIRRO, ESTADO, DESCRICAO, ID_DADOSPESSOAS, ID_MOTORISTA, ID_VIATURA) VALUES (NULL,pCIDADE, pDATAHORAINICIO, pDATAHORAFINAL, pCOR, pCEP, pRUA, pNUMERO, pBAIRRO, pESTADO, pDESCRICAO, pID_DADOSPESSOAS, pID_MOTORISTA, pID_VIATURA); end if; end if;
Gostei + 0
01/07/2018
Maurício Kalfelz
Tente dar uma pesquisada na sintaxe das procedures do MySQL principalmente em Estruturas Condicionais
Tem material aki na DevMedia mesmo:
https://www.devmedia.com.br/stored-procedures-no-mysql-5-estruturas-condicionais-e-exemplo-pratico-no-vb-net/5085
https://www.devmedia.com.br/stored-procedures-no-mysql/29030
Sugiro também modificar essa lógica, usar da seguinte forma:
if exists (Select * from VIAGENS where ID_VIATURA = pID_VIATURA AND pDATAHORAINICIO between DATAHORAINICIO and DATAHORAFINAL ) then Select 'Motorista ou Viatura indisponível na data/hora selecionada.' as 'Error'; else if exists (Select * from VIAGENS where ID_MOTORISTA = pID_MOTORISTA AND pDATAHORAINICIO between DATAHORAINICIO and DATAHORAFINAL ) then Select 'Motorista ou Viatura indisponível na data/hora selecionada.' as 'Error'; else INSERT INTO VIAGENS (IDVIAGENS, CIDADE, DATAHORAINICIO, DATAHORAFINAL, COR, CEP, RUA, NUMERO, BAIRRO, ESTADO, DESCRICAO, ID_DADOSPESSOAS, ID_MOTORISTA, ID_VIATURA) VALUES (NULL,pCIDADE, pDATAHORAINICIO, pDATAHORAFINAL, pCOR, pCEP, pRUA, pNUMERO, pBAIRRO, pESTADO, pDESCRICAO, pID_DADOSPESSOAS, pID_MOTORISTA, pID_VIATURA); end if; end if;
perfeito amigo, assim posso até dar uma mensagem de erro para motorista e uma separada para horario, obrigadooooo
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)