Estás cerca. Básicamente tu SELECT
no conduce a ninguna parte y el encabezado de su función dice que se supone que debe devolver un INT
valor. Dado que es un SQL
puro consulta usando CTE
, no hay necesidad de usar PLPGSQL
, así que también cambié el tipo de idioma a SQL
CREATE OR REPLACE FUNCTION fibonacci (lastN INTEGER)
RETURNS SETOF INTEGER LANGUAGE SQL AS $$
WITH RECURSIVE t(a, b) AS (
VALUES(0,1)
UNION ALL
SELECT GREATEST(a, b), a + b AS a from t
WHERE b < $1
)
SELECT a FROM t;
$$;
SELECT fibonacci(20);
EDITAR: según lo solicitado, la misma función usando el lenguaje PLPGSQL
CREATE OR REPLACE FUNCTION fibonacci (lastN INTEGER)
RETURNS SETOF INT LANGUAGE PLPGSQL AS $$
BEGIN
RETURN QUERY WITH RECURSIVE t(a, b) AS (
VALUES(0,1)
UNION ALL
SELECT GREATEST(a, b), a + b AS a from t
WHERE b < $1
)
SELECT a FROM t;
END $$;
SELECT fibonacci(20);