3
respostas

Tabela em branco

A minha saida esta em branco quando executo o msm comando que o professor executa em aula olhei umas 3 vezes e nao sei onde eu errei... Alem que o meu nos mostra o erro que é esperado de chave Na saida aparece o nome das tabelas so que nenhum item nele

CREATE DEFINER=`root`@`localhost` PROCEDURE `p_inserir_venda`(vData date, max_itens int, max_quantidade int)
BEGIN
declare vCliente varchar(11);
declare vProduto varchar(10);
declare vVendedor varchar(5);
declare vQuantidade int;
declare vPreco float;
declare vItens int;
declare vNumeroNota int default 1;
declare vContador int;
declare vNumItensNota int;
select max(numero) + 1 into vNumeroNota from notas_fiscais;
set vCliente = f_cliente_aleatorio();
set vVendedor = f_vendedor_aleatorio();
insert into notas_fiscais(cpf, matricula, data_venda, numero, imposto)
values(vCliente, vVendedor, vData, vNumeroNota, 0.18);
set vItens = f_numero_aleatorio(1, max_itens);
while vContador <= vItens
do
set vProduto = f_produto_aleatorio();
select count(*) into vNumItensNota from itens_notas_fiscais
where numero = vNumeroNota and codigo_do_produto = vProduto;
if vNumItensNota = 0 then

    set vQuantidade = f_numero_aleatorio(10, max_quantidade);
    select preco_de_lista into vPreco from tabela_de_produtos
    where codigo_do_produto = vProduto;
    insert into itens_notas_fiscais(numero, codigo_do_produto, quantidade, preco)
    values (vNumeroNota, vProduto, vQuantidade, vPreco);
end if;
set vContador = vContador + 1;
end while;
END
call p_inserir_venda('20201104', 30, 100);

select a.numero, count(*) as numero_itens, sum(b.quantidade * b.preco) as faturado
from notas_fiscais a inner join itens_notas_fiscais b
on a.numero = b.numero where a.DATA_VENDA = '20190517'
group by a.numero;
3 respostas

Olá Rodrigo, tudo bem?

Você já criou as duas funções que é utilizada nesta procedure? A função f_produto_aleatorio() e a função f_vendedor_aleatorio(). Você definiu um outro delimitador diferente de ponto e vírgula, para poder criar essa procedure? Por exemplo, o instrutor utilizou o $$ como delimitador.

USE sucos_vendas;

DROP procedure IF EXISTS p_inserir_venda;

DELIMITER $$

USE sucos_vendas$$

CREATE DEFINER=root@localhost PROCEDURE p_inserir_venda(vData DATE, max_itens INT,

max_quantidade INT)

BEGIN

DECLARE vCliente VARCHAR(11);

DECLARE vProduto VARCHAR(10);

DECLARE vVendedor VARCHAR(5);

DECLARE vQuantidade INT;

DECLARE vPreco FLOAT;

DECLARE vItens INT;

DECLARE vNumeroNota INT;

DECLARE vContador INT DEFAULT 1;

DECLARE vNumItensNota INT;

SELECT MAX(numero) + 1 INTO vNumeroNota from notas_fiscais;

SET vCliente = f_cliente_aleatorio();

SET vVendedor = f_vendedor_aleatorio();

INSERT INTO notas_fiscais (CPF, MATRICULA, DATA_VENDA, NUMERO, IMPOSTO)

VALUES (vCliente, vVendedor, vData, vNumeroNota, 0.18);

SET vItens = f_numero_aleatorio(1, max_itens);

WHILE vContador <= vItens

DO

   SET vProduto = f_produto_aleatorio();

   SELECT COUNT(*) INTO vNumItensNota FROM itens_notas_fiscais

   WHERE NUMERO = vNumeroNota AND CODIGO_DO_PRODUTO = vProduto;

   IF vNumItensNota = 0 THEN

      SET vQuantidade = f_numero_aleatorio(10, max_quantidade);

      SELECT PRECO_DE_LISTA INTO vPreco FROM tabela_de_produtos

      WHERE CODIGO_DO_PRODUTO = vProduto;

      INSERT INTO itens_notas_fiscais (NUMERO, CODIGO_DO_PRODUTO,

      QUANTIDADE, PRECO) VALUES (vNumeroNota, vProduto, vQuantidade, vPreco);

   END IF;

   SET vContador = vContador + 1;

END WHILE;

END$$

DELIMITER ;

Aguardo o seu retorno!

Eu fiz todas, o mysql nao aponta nenhum erro e apresenta a tabela, mas esta tudo vazio, copiei o seu codigo e substitui, mas o erro continua em branco a minha tabela de itens tb nao é alterada em nenhum momento

Certo Rodrigo, você poderia executar as três queries e tirar um print da sua tela a cada execução, e upar no Imgur e disponibilizar o link aqui, assim posso entender melhor o que pode está acontecendo no seu ambiente.

  • Você exclui a Procedure e em seguida cria novamente:
USE sucos_vendas;

DROP procedure IF EXISTS p_inserir_venda;

DELIMITER $$

USE sucos_vendas$$

CREATE DEFINER=root@localhost PROCEDURE p_inserir_venda(vData DATE, max_itens INT,

max_quantidade INT)

BEGIN

DECLARE vCliente VARCHAR(11);

DECLARE vProduto VARCHAR(10);

DECLARE vVendedor VARCHAR(5);

DECLARE vQuantidade INT;

DECLARE vPreco FLOAT;

DECLARE vItens INT;

DECLARE vNumeroNota INT;

DECLARE vContador INT DEFAULT 1;

DECLARE vNumItensNota INT;

SELECT MAX(numero) + 1 INTO vNumeroNota from notas_fiscais;

SET vCliente = f_cliente_aleatorio();

SET vVendedor = f_vendedor_aleatorio();

INSERT INTO notas_fiscais (CPF, MATRICULA, DATA_VENDA, NUMERO, IMPOSTO)

VALUES (vCliente, vVendedor, vData, vNumeroNota, 0.18);

SET vItens = f_numero_aleatorio(1, max_itens);

WHILE vContador <= vItens

DO

   SET vProduto = f_produto_aleatorio();

   SELECT COUNT(*) INTO vNumItensNota FROM itens_notas_fiscais

   WHERE NUMERO = vNumeroNota AND CODIGO_DO_PRODUTO = vProduto;

   IF vNumItensNota = 0 THEN

      SET vQuantidade = f_numero_aleatorio(10, max_quantidade);

      SELECT PRECO_DE_LISTA INTO vPreco FROM tabela_de_produtos

      WHERE CODIGO_DO_PRODUTO = vProduto;

      INSERT INTO itens_notas_fiscais (NUMERO, CODIGO_DO_PRODUTO,

      QUANTIDADE, PRECO) VALUES (vNumeroNota, vProduto, vQuantidade, vPreco);

   END IF;

   SET vContador = vContador + 1;

END WHILE;

END$$

DELIMITER ;
  • Em seguida você chama a procedure passando os seguintes dados:
call p_inserir_venda('20201106', 30, 100);
  • E em seguida realiza o Select:
select a.numero, count(*) as numero_itens, sum(b.quantidade * b.preco) as faturado
from notas_fiscais a inner join itens_notas_fiscais b
on a.numero = b.numero where a.DATA_VENDA = '20201106'
group by a.numero;

A data que você usou na chamada da procedure é diferente da utilizada no select, então você poderia utilizar a mesma data, como nos exemplos que usei?

Aguardo o seu retorno!