Eu realmente preciso otimizar isso kk Mas minha ideia foi essa, embora tenha ficado grande, funcionou perfeitamente. Eu sempre gosto de fazer as tabelas e estruturar o banco ao meu gosto, então vou adaptando as funções e as procedures de acordo com a modelagem das minhas tabelas.
CREATE OR REPLACE PROCEDURE RECALCULA_VLRTOTAL
IS
v_count INTEGER := 1;
v_max INTEGER;
v_total INTEGER;
v_prod pedido_venda_item.cod_produto%Type;
BEGIN
SELECT count(*)
INTO v_max
FROM pedido_venda_item;
LOOP
SELECT (pvi.quantidade * pvi.valor_unit) as valor_total
INTO v_total
FROM pedido_venda_item pvi
WHERE pvi.id = v_count;
SELECT pvi2.cod_produto
INTO v_prod
FROM pedido_venda_item pvi2
WHERE pvi2.id = v_count;
UPDATE pedido_venda_item
SET valor_total = v_total, imposto = retorna_imposto(v_prod)
WHERE id = v_count;
v_count := v_count + 1;
EXIT WHEN v_count > v_max;
END LOOP;
COMMIT;
END;