1
resposta

[Dúvida] Aula: Incluindo a Venda do modulo Problema prático do curso Procedures SQL: executando código no MYSQL

Ao dar CALL na minha Stored Procedure consta um erro (Error Code: 1048. Column 'NUMERO' cannot be null), já alterei os lugares que estavam faltando o vNumeroNota, mas não consigo encontrar o erro na rotina.

Como o erro é cannot be null, devo colocar na variável DECLARE vNumeroNota INT NOT NULL ?

CREATE 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;
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();
        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);
        SET vContador = vContador + 1;
END WHILE;

END
1 resposta

E aí, Gabrielle!

Essa linha SELECT MAX(numero) +1 INTO vNumeroNota FROM notas_fiscais; é a culpada por dar um valor pro 'vNumeroNota'. Se a tabela 'notas_fiscais' estiver zerada, o MAX(numero) vai ser NULL e, bateu, o 'vNumeroNota' também vai ficar NULL.

Então, saca só: tu pode resolver isso dando um jeito quando o MAX(numero) for NULL. Que tal colocar um IF na tua procedure? Tipo assim:

SELECT MAX(numero) INTO vNumeroNota FROM notas_fiscais;
IF vNumeroNota IS NULL THEN
    SET vNumeroNota = 1;
ELSE
    SET vNumeroNota = vNumeroNota + 1;
END IF;

Assim, se a 'notas_fiscais' tiver de bobeira, o 'vNumeroNota' leva um 1 na lata. Se não, ele pega o maior número que tem lá e soma mais 1.

Espero que clareie as ideias! Valeu e boa sorte com isso!