MySQL não reconhecendo variável que existe

8 respostas
mysql
Sulvo

Estou tentando desenvolver uma procedure de efetivação de compra de apartamento de acordo com o identificador do proprietário comprador e o número do apartamento passados como parâmetro. O processo deverá atribuir ao apartamento o identificador do novo proprietário, porém não consigo alterar o ‘rg_prop’, então tentei fazer uma procedure na qual ela altera os dados de um proprietário (da table ‘proprietario’) mas agora deu um erro na qual ele diz que a variável ‘nome’ não existe:

Operation failed: There was an error while applying the SQL script to the database.
Executing:
USE `imobiliaria`;
DROP procedure IF EXISTS `compra_ap`;

USE `imobiliaria`;
DROP procedure IF EXISTS `imobiliaria`.`compra_ap`;
;

DELIMITER $$
USE `imobiliaria`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `compra_ap`(IN rg_novo varchar(15), IN nome_novo varchar(80), IN telefone_novo varchar(15), IN email_novo varchar(50))
	BEGIN
		UPDATE proprietario 
			SET rg = rg_novo; 
			SET nome = nome_novo; 
			SET telefone = telefone_novo; 
			SET email = email_novo;
	END$$

DELIMITER ;
;

ERROR 1193: Unknown system variable 'nome'
SQL Statement:
CREATE DEFINER=`root`@`localhost` PROCEDURE `compra_ap`(IN rg_novo varchar(15), IN nome_novo varchar(80), IN telefone_novo varchar(15), IN email_novo varchar(50))
	BEGIN
		UPDATE proprietario 
			SET rg = rg_novo; 
			SET nome = nome_novo; 
			SET telefone = telefone_novo; 
			SET email = email_novo;
	END

Banco de Dados:

create database imobiliaria;

use imobiliaria;

create table sindico (
  matricula int(3) not null auto_increment,
  nome varchar(80) default null,
  endereco varchar(80) default null,
  telefone varchar(15) default null,
  primary key (matricula)
);

insert into sindico values (1,'antonio carlos','avenida santos dummont, número 789, califórnia, £o paulo','([telefone removido]'),(2,'sidnei delgado','alameda xv de novembro, número 123, jockey club, £o paulo','([telefone removido]');

create table condominio (
  codigo int(5) not null auto_increment,
  nome varchar(50) default null,
  endereco varchar(80) default null,
  matricula_sind int(3) default null,
  primary key (codigo),
  key fx_cond_sindico (matricula_sind),
  constraint fx_cond_sindico foreign key (matricula_sind) references sindico (matricula)
);

insert into condominio values (1,'condomínio £o paulo','alameda getulio vargas, número 897, centro, £o paulo',1),(2,'condomínio brasil','avenida general gusmão, número 453, penha, £o paulo',2);

create table apartamento (
  numero varchar(5) not null,
  tipo varchar(20) default null,
  codigo_cond int(5) default null,
  valor double(10,2) default '0.00',
  primary key (numero),
  key fk_ap_cond (codigo_cond),
  constraint fk_ap_cond foreign key (codigo_cond) references condominio (codigo)
);

insert into apartamento values ('a101','padrão',1,100000.00),('a201','padrão',1,115000.00),('a301','padrão',1,125000.00),('a401','padrão',1,135000.00),('a501','cobertura',1,150000.00),('b101','padrão',2,200000.00),('b201','padrão',2,215000.00),('b301','padrão',2,225000.00),('b401','padrão',2,235000.00),('b501','cobertura',2,250000.00);

create table garagem (
  numero int(3) not null auto_increment,
  tipo varchar(20) default null,
  numero_ap varchar(5) default null,
  primary key (numero),
  key fk_gar_apartamento (numero_ap),
  constraint fk_gar_apartamento foreign key (numero_ap) references apartamento (numero)
);

insert into garagem values (1,'padrão','a101'),(2,'padrão','a201'),(3,'padrão','a301'),(4,'padrão','a401'),(5,'coberta','a501'),(6,'padrão','b101'),(7,'padrão','b101'),(8,'padrão','b201'),(9,'padrão','b201'),(10,'padrão','b301'),(11,'padrão','b301'),(12,'padrão','b401'),(13,'padrão','b401'),(14,'coberta','b501'),(15,'coberta','b501');

create table proprietario (
  rg varchar(15) not null,
  nome varchar(80) default null,
  telefone varchar(15) default null,
  email varchar(50) default null,
  primary key (rg)
);

insert into proprietario values ('12345678-0','carlos eduardo','([telefone removido]','[email removido]'),('32145678-4','oswaldo lima','([telefone removido]','[email removido]'),('32156788-0','pedro castro','([telefone removido]','[email removido]'),('46536267-3','maria luiza','([telefone removido]','[email removido]'),('54367281-2','joana darc','([telefone removido]','[email removido]'),('74853928-2','benedito goes','([telefone removido]','[email removido]'),('76534126-4','matheus henrique','([telefone removido]','[email removido]'),('98635314-5','augusto silva','([telefone removido]','[email removido]'),('99987271-1','marcos vinicius','([telefone removido]','[email removido]');

create table proprietario_apartamento (
  prop_ap_id int(3) not null auto_increment,
  numero_ap varchar(5) default null,
  rg_prop varchar(15) default null,
  primary key (prop_ap_id),
  key fk_pa_apartamento (numero_ap),
  key fk_pa_proprietario (rg_prop),
  constraint fk_pa_apartamento foreign key (numero_ap) references apartamento (numero),
  constraint fk_pa_proprietario foreign key (rg_prop) references proprietario (rg)
);

insert into proprietario_apartamento values (1,'a101','12345678-0'),(2,'a201','32145678-4'),(3,'a301','32156788-0'),(4,'a401','46536267-3'),(5,'a501','54367281-2'),(6,'b101','74853928-2'),(7,'b201','76534126-4'),(8,'b301','98635314-5'),(9,'b401','99987271-1'),(10,'b501','99987271-1');

8 Respostas

Dragoon

O comando para atualizar dados em um tabela de banco de dados relacionado tem a seguinte sintaxe:

UPDATE *table_name*
SET *column1* = *value1* , *column2* = *value2* , ...
WHERE *condition* ;

Referencia: SQL UPDATE Statement

Então o seu comando UPDATE está errado, deveria basicamente:

UPDATE proprietario SET rg = rg_novo, nome = nome_novo, 
    telefone = telefone_novo, email = email_novo

mais também falta o WHERE para dizer qual item/itens vai/vão ser atualizado, desse jeito como eu coloque vai atualizar a tabela inteira com a mesma informação e isso é um outro erro grave, sempre em UPDATE deve conter alguma limitação se não vai ter um catastofre onde todos os itens da tabela podem ser atualizado.

O comando mais aproximado do correto no seu caso é assim:

UPDATE proprietario SET rg = rg_novo, nome = nome_novo, 
    telefone = telefone_novo, email = email_novo WHERE id=1

Ou seja, com WHERE definindo algum ponto a ser feito, claro existe também atualizações em todos os campos, mas, acho que não é o seu caso.

Sulvo

Não funcionou, mas nem sei se o que eu estou fazendo está correto também, pois no exercício ele pede para: “Desenvolva um procedure de efetivação de compra de apartamento de acordo com o identificador do proprietário comprador e o número do apartamento passados como parâmetro. O processo deverá atribuir ao apartamento o identificador do novo proprietário.”

Mas o que eu tinha em mente era remover os dados de uma pessoa e colocar os dados do novo proprietario, mas não sei como fazer isso, ainda mais que tenho que usar os parâmetros.

Dragoon

Está muito confuso o que você está fazendo e o que é pra ser feito, então eu tentei te explicar o que é UPDATE e acho que você não entendeu, é um trabalho de faculdade?

Sulvo

Não, é uma atividade do meu curso

Dragoon

Precisar tirar suas dúvidas no curso eu acho melhor pra ti

Sulvo

É mas os tutores respondem apenas na semana e fiquei sem energia por 2 dias por causa da ventania que tava aqui

Sulvo

Estava tentando um método diferente de simular uma compra de apartamento usando o ‘insert into’ mas acabei encontrando um erro de sintaxe no meu comando ‘call’, não sei como se livrar dele

call compra_ap (12343567-4, Mateus Dias, ([telefone removido], [email removido]);
pmlm

Provavelmente faltam-te as plicas ou aspas simples

call compra_ap ('12343567-4', 'Mateus Dias', '([telefone removido]', '[email removido]');
Criado 14 de agosto de 2022
Ultima resposta 15 de ago. de 2022
Respostas 8
Participantes 3