postgreSQL 斐波那契数列 - 查询没有结果数据的目的地
postgreSQL Fibonacci Sequence - Query has no destination for result data
所以我写了一个这样的斐波那契数列函数:
CREATE OR REPLACE FUNCTION fibonacci (lastN INTEGER)
RETURNS int AS $$
BEGIN
WITH RECURSIVE t(a, b) AS (
VALUES(0,1)
UNION ALL
SELECT GREATEST(a, b), a + b AS a from t
WHERE b <
)
SELECT a FROM t;
END;
$$ LANGUAGE plpgsql;
但是当我打电话时:
SELECT * FROM fibonacci(20);
控制台显示:
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function fibonacci(integer) line 5 at SQL statement
我认为 Return 语句应该 return 查询结果,但事实并非如此。在编写这样的 SQL 函数方面,我完全是个新手。
你很接近。基本上你的 SELECT
无处可去,你的函数 header 说它应该 return 一个 INT
值。由于是使用CTE
的纯SQL
查询,没有必要使用PLPGSQL
,所以我也把语言类型改成了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 <
)
SELECT a FROM t;
$$;
SELECT fibonacci(20);
编辑: 根据要求,使用语言 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 <
)
SELECT a FROM t;
END $$;
SELECT fibonacci(20);
所以我写了一个这样的斐波那契数列函数:
CREATE OR REPLACE FUNCTION fibonacci (lastN INTEGER)
RETURNS int AS $$
BEGIN
WITH RECURSIVE t(a, b) AS (
VALUES(0,1)
UNION ALL
SELECT GREATEST(a, b), a + b AS a from t
WHERE b <
)
SELECT a FROM t;
END;
$$ LANGUAGE plpgsql;
但是当我打电话时:
SELECT * FROM fibonacci(20);
控制台显示:
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function fibonacci(integer) line 5 at SQL statement
我认为 Return 语句应该 return 查询结果,但事实并非如此。在编写这样的 SQL 函数方面,我完全是个新手。
你很接近。基本上你的 SELECT
无处可去,你的函数 header 说它应该 return 一个 INT
值。由于是使用CTE
的纯SQL
查询,没有必要使用PLPGSQL
,所以我也把语言类型改成了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 <
)
SELECT a FROM t;
$$;
SELECT fibonacci(20);
编辑: 根据要求,使用语言 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 <
)
SELECT a FROM t;
END $$;
SELECT fibonacci(20);