Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgreSQL斐波那契序列-查询没有结果数据的目标_Sql_Postgresql_Recursion_Plpgsql_Common Table Expression - Fatal编程技术网

postgreSQL斐波那契序列-查询没有结果数据的目标

postgreSQL斐波那契序列-查询没有结果数据的目标,sql,postgresql,recursion,plpgsql,common-table-expression,Sql,Postgresql,Recursion,Plpgsql,Common Table Expression,所以我写了一个斐波那契序列函数如下: 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 < $1 ) SELECT a FROM t; END

所以我写了一个斐波那契序列函数如下:

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 < $1
)
SELECT a FROM t;
END;
$$ LANGUAGE plpgsql;
控制台显示:

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语句应该返回查询结果,但事实并非如此。我对编写这样的SQL函数是一个全新的人。

你很接近了。基本上,您的
SELECT
没有任何结果,并且您的函数头说它应该返回
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 < $1
)
SELECT a FROM t;
$$;

SELECT fibonacci(20);
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);

试试这个:选择斐波那契(20)@anonyXmous仍然给我同样的感觉error@anonyXmous问题在于,这个查询导致了现在,您所做的改进的快速解释可能会有所帮助:)只是添加了一个简短的解释:-)谢谢您的帮助remind@JimJones谢谢你的解释。但是如果我想使用plpgsql来实现这一点呢?您将如何修改此查询?@TravisSu刚刚在我的回答中添加了此函数的
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);