Olá, Adriano. Como vai?
Parabéns pela excelente resolução do desafio e pela postura ativa nos seus estudos! Utilizar a Inteligência Artificial como um tutor, fazendo perguntas para construir a própria lógica em vez de apenas copiar o código pronto, é a melhor forma de se desenvolver como programador.
O uso do EXIT WHEN no meio do bloco de repetição é uma excelente característica do PL/SQL, permitindo que você controle a saída do laço no momento exato em que a condição limite é atingida, evitando processamentos desnecessários.
Analisando o seu código e a imagem com o resultado da saída do script, sua lógica matemática para a sequência de Fibonacci ficou perfeita. No entanto, há um pequeno detalhe sintático bem no final do seu bloco de código que vale a pena ajustarmos para que sua procedure funcione corretamente no banco de dados.
Ajuste no Fechamento do Bloco PL/SQL
No trecho final do código que você compartilhou, você colocou a linha EXECUTE FIBONACCI(100); dentro do escopo da própria procedure.
Da forma como está estruturado, faltou fechar o laço com END LOOP; e finalizar a procedure com END FIBONACCI;. A chamada do comando EXECUTE (ou simplesmente EXEC) deve ser feita do lado de fora, no script de execução do banco.
Aqui está o ajuste necessário para corrigir a estrutura:
CREATE OR REPLACE PROCEDURE FIBONACCI
(p_LIMITE IN NUMBER) IS
v_VALOR_A NUMBER := 0;
v_VALOR_B NUMBER := 1;
v_PROXIMO NUMBER;
BEGIN
DBMS_OUTPUT.PUT_LINE('Sequência de Fibonacci até ' || p_LIMITE || ':');
DBMS_OUTPUT.PUT_LINE(v_VALOR_A);
DBMS_OUTPUT.PUT_LINE(v_VALOR_B);
LOOP
v_PROXIMO := v_VALOR_A + v_VALOR_B;
EXIT WHEN v_PROXIMO > p_LIMITE;
DBMS_OUTPUT.PUT_LINE(v_VALOR_A || ' + ' || v_VALOR_B || ' = ' || v_PROXIMO);
v_VALOR_A := v_VALOR_B;
v_VALOR_B := v_PROXIMO;
END LOOP; -- Fecha o laço de repetição
END FIBONACCI; -- Finaliza a procedure
/
Depois de compilar o código corrigido acima, aí sim você utiliza o comando de execução no seu terminal ou planilha de scripts:
EXEC FIBONACCI(100);
Por que sua lógica funcionou?
A ordem em que você atualizou as variáveis dentro do laço mostra que você captou muito bem o conceito de deslocamento de valores:
v_VALOR_A recebe o valor de v_VALOR_Bv_VALOR_B recebe o valor do v_PROXIMO
Esse mecanismo "passa o bastão" para a próxima iteração com maestria, garantindo a construção exata exibida na imagem da sua saída. A criação do parâmetro p_LIMITE foi uma excelente jogada de arquitetura para deixar o componente reutilizável para qualquer número.
Espero que possa ter lhe ajudado!