Procedure MYSQL Desesperado
lá pessoal, estou em um semestre onde apresento um trabalho em banco de dados, sei que a procedure que estou cirando ficaria melhor na aplicação, porém preciso apresentar somente o banco de dados, um amigo me ajudou mas ele fez a logica em sql, tentei converter para MYSQl porém está dando erro, mostrarei a procecure e o erro, se precisarem posso postar também as tabelas, agradece qualquer ajuda estou desesperado.
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.
e esse é o erro
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
Curtidas 0
Melhor post
Kleber Santos
01/07/2018
O SQL é padrão para os SGBDs, oq ocorre é que eles implementam algumas funcionalidades particulares.
No Postgres a sintaxe da Procedure fica da seguinte maneira:
De uma olhada na sintaxe de procedure do MySQL, acredito que não deve ficar longe do Postgres
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
GOSTEI 1
Mais Respostas
Kleber Santos
30/06/2018
Olhando melhor está ocorrendo o erro na linha 24
tentou colocar ;(ponto e virgula) no final da linha 23?
Por exemplo:
tentou colocar ;(ponto e virgula) no final da linha 23?
Por exemplo:
then set DisponibilidadeViatura = 0; else then set DisponibilidadeViatura = 1;
GOSTEI 1
Maurício Kalfelz
30/06/2018
Olhando melhor está ocorrendo o erro na linha 24
tentou colocar ;(ponto e virgula) no final da linha 23?
Por exemplo:
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
Kleber Santos
30/06/2018
É um erro de sintaxe.
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:
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
Maurício Kalfelz
30/06/2018
É um erro de sintaxe.
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:
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