Procedure MYSQL Desesperado

30/06/2018

0

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.

		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

Maurício Kalfelz

Responder

Post mais votado

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:
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

Kleber Santos
Responder

Mais Posts

01/07/2018

Kleber Santos

Olhando melhor está ocorrendo o erro na linha 24

tentou colocar ;(ponto e virgula) no final da linha 23?

Por exemplo:
then set DisponibilidadeViatura = 0;
    else
 then set DisponibilidadeViatura = 1;
Responder

01/07/2018

Maurício Kalfelz

Olhando melhor está ocorrendo o erro na linha 24

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


Responder

01/07/2018

Kleber Santos

É 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:

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;

Responder

01/07/2018

Maurício Kalfelz

É 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:

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
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar