Du bist nah dran. Im Grunde Ihr SELECT
führt ins Nirgendwo und Ihr Funktionsheader sagt, dass er einen INT
zurückgeben soll Wert. Da es sich um ein reines SQL
handelt Abfrage mit CTE
, muss PLPGSQL
nicht verwendet werden , also habe ich auch den Sprachtyp auf SQL
geändert
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);
BEARBEITEN: Wie gewünscht, die gleiche Funktion mit der Sprache 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);