1
resposta

[Sugestão] Resolução SOMA_VENDAS com FOR

create or replace  PROCEDURE SOMA_VENDAS
(
p_VALOR_ESTIPULADO NUMBER 
)
IS
   v_valor_acumulado NUMBER := 0; 
   v_id_atual NUMBER;
   
BEGIN

   FOR i IN (SELECT id, VALOR_TOTAL FROM PRODUTO_VENDA_EXERCICIO ORDER BY id ) LOOP
      v_valor_acumulado := v_valor_acumulado + i.VALOR_TOTAL;
      v_id_atual := i.id;

      IF v_valor_acumulado >= p_VALOR_ESTIPULADO THEN
         EXIT; 
      END IF;
   END LOOP;

   DBMS_OUTPUT.PUT_LINE('ID do último registro considerado: ' || v_id_atual);
   DBMS_OUTPUT.PUT_LINE('Valor acumulado: ' || v_valor_acumulado);
END;
1 resposta

Olá, Luan! Parece que você já fez um bom trabalho com a procedure SOMA_VENDAS. Seu código está bem organizado e fácil de entender.

A procedure que você criou está correta e deve funcionar conforme o esperado. Ela percorre a tabela PRODUTO_VENDA_EXERCICIO em ordem de ID, acumulando o VALOR_TOTAL de cada venda até que a soma acumulada seja maior ou igual ao p_VALOR_ESTIPULADO. Quando isso acontece, a procedure sai do loop e imprime o ID da última venda considerada e o valor acumulado.

Aqui está um exemplo de como você pode chamar a procedure:

BEGIN
   SOMA_VENDAS(20000);
END;

Nesse exemplo, estamos chamando a procedure SOMA_VENDAS com p_VALOR_ESTIPULADO igual a 20000. A procedure irá percorrer a tabela PRODUTO_VENDA_EXERCICIO e somar o VALOR_TOTAL de cada venda até que a soma seja maior ou igual a 20000. Então, ela imprimirá o ID da última venda considerada e o valor acumulado.

Espero ter ajudado e bons estudos!