Bạn đã gần gũi. Về cơ bản SELECT
của bạn dẫn đến hư không và tiêu đề hàm của bạn cho biết nó phải trả về INT
giá trị. Vì nó là SQL
thuần túy truy vấn sử dụng CTE
, không cần sử dụng PLPGSQL
, vì vậy tôi cũng đã thay đổi loại ngôn ngữ thành 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);
CHỈNH SỬA: theo yêu cầu, cùng một chức năng sử dụng ngôn ngữ 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);