Espero ter compreendido o objetivo do exercício.
Solução com procedure:
CREATE OR REPLACE PROCEDURE CALCULA_SEQ_FIBONACCI
(
p_INDICE IN FLOAT
)
AS
v_N1 FLOAT := 0;
v_N2 FLOAT := 1;
v_RESP FLOAT := 0;
v_COUNT FLOAT := 1;
v_INDICE FLOAT := p_INDICE;
BEGIN
CASE
WHEN v_INDICE <= 0 THEN RETURN; -- ÍNDICE COMEÇA EM 1
WHEN v_INDICE = 1 THEN
DBMS_OUTPUT.PUT_LINE(v_N1); -- NÚM IGUAL A 0
WHEN v_INDICE > 1 THEN
DBMS_OUTPUT.PUT_LINE(v_N1); -- NÚM IGUAL A 0
DBMS_OUTPUT.PUT_LINE(v_N2); -- NÚM IGUAL A
ELSE
DBMS_OUTPUT.PUT_LINE(v_N1);
DBMS_OUTPUT.PUT_LINE(v_N2);
END CASE;
LOOP
v_RESP := v_N1 + v_N2;
v_N1 := v_N2;
v_N2 := v_RESP;
v_COUNT := v_COUNT + 1;
DBMS_OUTPUT.PUT_LINE(v_RESP);
EXIT WHEN v_COUNT >= v_INDICE;
END LOOP;
END;
Teste da procedure:
SET SERVEROUT ON;
BEGIN
CALCULA_SEQ_FIBONACCI(45);
END;
Solução com bloco anônimo:
SET SERVEROUTPUT ON;
DECLARE
v_N1 FLOAT := 0;
v_N2 FLOAT := 1;
v_RESP FLOAT := 0;
v_COUNT FLOAT := 1;
v_STOP FLOAT := 0;
BEGIN
DBMS_OUTPUT.PUT_LINE(v_N1);
DBMS_OUTPUT.PUT_LINE(v_N2);
LOOP
v_RESP := v_N1 + v_N2;
v_N1 := v_N2;
v_N2 := v_RESP;
v_COUNT := v_COUNT + 1;
DBMS_OUTPUT.PUT_LINE(v_RESP);
EXIT WHEN v_COUNT >= v_STOP;
END LOOP;
END;