Problemas para alterar o valor em MySQL

Fiz uma procedure para alterar o valor dos apartamentos porém o valor é alterado para um número muito grande e não tenho certeza porque
Aqui está a procedure usada e o código do banco de dados

Procedure:

CREATE DEFINER=`root`@`localhost` PROCEDURE `atualizar_valor_ap`()
BEGIN
UPDATE apartamento
SET valor = valor*(1+(valor/100))
WHERE codigo_cond = 1;
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, são paulo','(11) 3456-6787'),(2,'sidnei delgado','alameda xv de novembro, número 123, jockey club, são paulo','(11) 3452-4562');

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 são paulo','alameda getulio vargas, número 897, centro, são paulo',1),(2,'condomínio brasil','avenida general gusmão, número 453, penha, sã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','(11) 3256-7890','carloseduardoead@email.com.br'),('32145678-4','oswaldo lima','(11) 2314-9876','oswaldolimaead@email.com.br'),('32156788-0','pedro castro','(11) 3452-8743','pedroead@email.com.br'),('46536267-3','maria luiza','(11) 2345-1627','marialuizaead@email.com.br'),('54367281-2','joana darc','(11) 4563-2315','joanadarcead@email.com.br'),('74853928-2','benedito goes','(11) 3427-4132','beneditogoesead@email.com.br'),('76534126-4','matheus henrique','(11) 2234-1123','matheushenriqueead@email.com.br'),('98635314-5','augusto silva','(11) 4122-2134','augustosilvaead@email.com.br'),('99987271-1','marcos vinicius','(11) 2124-2427','marcosviniciusead@email.com.br');

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');

1 curtida

Deixa eu ver se eu entendi: o valor alterado naquela representação SET valor = valor*(1+(valor/100)) está dando um valor muito fora do padrão?

Se for isso porque no banco você não utilizou decimal(18,2) ou algum tamanho melhor para o seu problema?

Deixa eu ver se eu entendi: o valor alterado naquela representação SET valor = valor*(1+(valor/100)) está dando um valor muito fora do padrão?

Sim, era para dar um número muito menor, não tenho certeza porque mas o valor foi de “'99999999.99”

SET valor = valor*(1+(valor/100)), explica essa formula para ver se ela está certa? o que você pretende fazer com o valor? (estou achando que o problema tem também relação com a formula)

Qual valor era e qual valor ficou? e qual valor deveria ficar?

O processo deveria alterar o valor dos apartamentos somente do condomínio e percentual definido por um valor inteiro (10% = 10), passados como parâmetros

é que sua procedure não tem parametro e também precisa passar o valor percentual da seguinte forma pelo menos eu acho: set valor = (valor + (valor * (10 / 100))) e no lugar do 10 o parametro.

Bom deve ser isso se eu entendi.

CREATE DEFINER=`root`@`localhost` PROCEDURE `atualizar_valor_ap`(IN perc int)
BEGIN
UPDATE apartamento
SET valor = (valor + (valor * (perc / 100)))
WHERE codigo_cond = 1;
END

No parametro se passa o valor total da porcentagem tipo 10, 20 que é igual 10%, 20%, mas, você passa o valor inteiro, ou seja, 10 etc …

CALL atualizar_valor_ap(10);

Referencia: MySQL :: MySQL 8.0 Reference Manual :: 13.1.17 CREATE PROCEDURE and CREATE FUNCTION Statements

Mesmo assim não funcionou, não tenho certeza se é um erro do banco ou da procedure

Edit: O erro é “Error Code: 1318. Incorrect number of arguments for PROCEDURE imobiliaria.atualizar_valor_ap; expected 0, got 1”

1 curtida

Como você chama, em alguma linguagem ou está chamando diretamente essa procedure?

Respondendo: Exemplo

Tabela:

CREATE TABLE `apartamento` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `valor` decimal(18,2) NOT NULL DEFAULT '0.00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

Procedure:

CREATE DEFINER=`root`@`localhost` PROCEDURE `atualizar_valor_ap`(IN perc INT, IN id INT)
BEGIN
	UPDATE apartamento SET apartamento.valor = (apartamento.valor + (apartamento.valor * (perc / 100))) 
		WHERE apartamento.id = id;
END

Eu funcionou certinho chamando assim:

CALL atualizar_valor_ap(10, 1);

no caso eu passo o porcento em inteiro e o id a ser alterado também em inteiro.

Faz o seguinte mostre como está fazendo para que possamos ajudar!

Beleza, só pra esclarecer, o “apartamento.valor” no caso seria só valor correto? porque não tem essa variável na minha base

Explicando: no meu exemplo eu tive que colocar o nome da tabela e o nome do campo, por causa do paramentro id e do campo id para diferenciar, mas, no seu caso talvez não precise, confundiu um pouco, mas, faz assim relata a sua tabela somente e onde está utilizando esse código para que possamos entender e solucionar

A programação funcionou mas por algum motivo o id não está sendo lido quando a procedure é chamada, estava fazendo testes e quando eu mudei o codigo_cond para 1 em vez de ‘id’ e ele alterou os resultados

Deixa eu ver sua programação? então o problema não é procedure é na passagem dos argumentos

CREATE DEFINER=`root`@`localhost` PROCEDURE `atualizar_valor_ap`(IN perc INT, IN id INT)
BEGIN
UPDATE apartamento SET valor = (valor + (valor * (perc / 100))) 
		WHERE codigo_cond = id;
END

mudei apenas uma coisa ou outra no código mas acho que não afeta em nada

agora está normal o procedure, teste ela com os paramentros no seu Banco de dados e depois coloque na linguagem e passa os argumentos igual no teste!

Muito obrigado! A programação funcionou da forma que deveria

1 curtida