【问题标题】:postgreSQL Fibonacci Sequence - Query has no destination for result datapostgreSQL 斐波那契数列 - 查询没有结果数据的目的地
【发布时间】:2023-04-06 19:34:01
【问题描述】:

所以我写了一个这样的斐波那契数列函数:

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;

但是当我打电话时:

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

【问题讨论】:

  • 试试这个:选择斐波那契(20);
  • @anonyXmous 仍然给我同样的错误
  • @anonyXmous 问题在于查询无处可去

标签: sql postgresql recursion plpgsql common-table-expression


【解决方案1】:

你很接近。基本上你的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);

编辑:根据要求,使用语言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);

【讨论】:

  • 快速解释一下您所做的改进会很有帮助:)
  • 刚刚添加了一个简短的解释 :-) 感谢您的提醒
  • @JimJones 感谢您的解释。但是如果我想使用 plpgsql 来实现呢?您将如何修改此查询?
  • @TravisSu 刚刚在我的回答中添加了此功能的plpgsql 版本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2020-01-18
  • 2013-08-03
  • 2014-05-19
  • 2015-08-30
相关资源
最近更新 更多