2
respostas

[Bug] Resolução do exercício soma_valor sem sucesso

Boa tarde, não estou conseguindo entende ro que fiz de errado no exercício. A mensagem de erro parece-me dizer que a função que criei retorna mais de uma linha como resultado? (o erro está transcrito no final dessa mensagem).

Meu codigo

create or replace function soma_valor
(
    p_valor_limite in produto_venda_exercicio.valor_total%type
)
return integer
is
    v_ponteiro    integer := 1;
    v_valor       produto_venda_exercicio.valor_total%type := 0;
    v_valor_total produto_venda_exercicio.valor_total%type :=0;
    v_limite      integer := 1;
    v_valor_limite produto_venda_exercicio.valor_total%type :=0;
begin
    select max(id) into v_limite from produto_venda_exercicio;
    for v_ponteiro in 1..V_Limite loop
        select valor_total into v_valor from produto_venda_exercicio where id = v_ponteiro;
        v_valor_total := v_valor_total+v_valor;
        if v_valor_total > p_valor_limite then
            exit;
        end if;
    end loop;
    return v_ponteiro;
end soma_valor;

set serveroutput on;
declare
    v_id produto_venda_exercicio.valor_total%type;
begin
    v_id := soma_valor(10000);
    dbms_output.put_line(v_id);
end;

Erro obtido

Erro a partir da linha : 25 no comando -
declare
    v_id produto_venda_exercicio.valor_total%type;
begin
    v_id := soma_valor(10000);
    dbms_output.put_line(v_id);
end;
Relatório de erros -
ORA-01422: a extração exata retorna mais do que o número solicitado de linhas
ORA-06512: em "CURSOPLSQL.SOMA_VALOR", line 15
ORA-06512: em line 4
01422. 00000 -  "exact fetch returns more than requested number of rows"
*Cause:    The number specified in exact fetch is less than the rows returned.
*Action:   Rewrite the query or change number of rows requested
2 respostas

O erro que relatei encontrei a solução. A tabela produto_venda_exercicio estava com registros duplicados (id náo é chave única e px). No entanto, o codigo está errado. Está sempre retornando o ID 1 como sendo aquele que, somado valor total, superou o limite sugerido.

Olá, Gustavo, tudo bem?

Ufa! Que bom que encontrou a solução, e fico feliz que tenha compartilhado aqui o erro que estava gerando esse comportamento.

Gustavo, caso surja alguma dúvida, fico à disposição.

Abraços e bons estudos!