Procedure MYSQL Desesperado
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
Post 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
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;
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
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;
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
Clique aqui para fazer login e interagir na Comunidade :)