Tu es proche. Fondamentalement, votre SELECT
ne mène nulle part et votre en-tête de fonction indique qu'il est censé renvoyer un INT
évaluer. Puisqu'il s'agit d'un pur SQL
requête utilisant CTE
, il n'est pas nécessaire d'utiliser PLPGSQL
, j'ai donc également changé le type de langage en 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);
MODIF : comme demandé, la même fonction en utilisant le langage 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);