1
resposta

[Sugestão] Possibilidade de Resolução

Fiz sem o uso da variável v_id, creio que também funcionou.

CREATE OR REPLACE PROCEDURE soma_vendas_cursor_for
(p_venda_limite IN produto_venda_exercicio.valor_total%TYPE, p_id_retorno OUT produto_venda_exercicio.id%TYPE)
IS
    v_valor_total produto_venda_exercicio.valor_total%TYPE;
    v_venda_total produto_venda_exercicio.valor_total%TYPE := 0;
    CURSOR cur_produto_venda IS SELECT id FROM produto_venda_exercicio;
BEGIN
    FOR linha_cursor IN cur_produto_venda LOOP
        SELECT valor_total INTO v_valor_total FROM produto_venda_exercicio WHERE id = linha_cursor.id;
        v_venda_total := v_venda_total + v_valor_total;
        IF v_venda_total >= p_venda_limite THEN
            p_id_retorno := linha_cursor.id;
            EXIT;
        END IF;
    END LOOP;  
END;

SET SERVEROUTPUT ON;
DECLARE
    v_num INTEGER;
BEGIN
    soma_vendas_cursor_for(20000, v_num);
    dbms_output.put_line(v_num);
END;
1 resposta

Olá Kaue, tudo bem com você?

A variável v_id no código original era usada para armazenar o valor do id atual enquanto o cursor estava sendo percorrido. No seu código, você usou linha_cursor.id diretamente, que é o id da linha atual do cursor. Isso é totalmente válido e, de fato, é uma das vantagens de usar a estrutura FOR com um cursor: você pode acessar os campos da linha atual diretamente, sem precisar de variáveis adicionais.

Sua solução está correta. Continue praticando e conte com o apoio do Fórum da Alura.

Abraços e bons estudos!