SELECT 和 FUNCTION 调用之间的查询行为不同

Posted

技术标签:

【中文标题】SELECT 和 FUNCTION 调用之间的查询行为不同【英文标题】:Query behaviour differs between SELECT and FUNCTION call 【发布时间】:2010-12-07 20:03:51 【问题描述】:

背景

为 SQL 语句创建包装函数。

问题

一个函数返回 1 行,而该函数所基于的查询返回 100+ 行。参数值相同:

SELECT * FROM as_rpt.tasc_fsa( 'ABC', '2010-01-01'::date, '2011-01-01'::date );

tasc_fsa 函数是一个带有几个表连接的 SELECT 语句;函数语言是 'sql' 而不是 'plpgsql'。

问题

什么原因会返回单行但该函数使用的查询完全相同,当不通过该函数调用时,正确返回超过 100 行?

任何想法都会很有帮助。

谢谢!

【问题讨论】:

【参考方案1】:

你有没有使用 RETURN SETOF ...?

SETOF 表示要返回多于 1 行。

我很确定你忘了使用“RETURN SETOF”。

【讨论】:

【参考方案2】:

您提到了“连接几个表”的功能。你的例子显然没有。如果正在执行连接,则可能会导致较少的结果。

日期的解释方式是另一种可能性。得到 1 个答案时,是否在您指定的范围内?

【讨论】:

我在函数使用的查询中包含了源代码。当执行部分函数时,查询产生 1 行。当使用完全相同的参数运行完全相同的查询(字面意思是复制和粘贴)时,将返回 100 多行。希望能澄清事情。 我仍然怀疑 $1 和 $2(日期范围)正在以某种方式更改。尝试将您的日期范围硬编码到函数中,看看会发生什么。 我使用了错误的函数定义模板。 :-( 我有多种函数,一些返回单行,一些返回多行。我使用“单行”返回函数之一作为起点编写函数,从没想过检查函数原型。谢谢,不过!

以上是关于SELECT 和 FUNCTION 调用之间的查询行为不同的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之select查询function函数

使用 IF ... THEN ... ELSE 在两个 SELECT 查询之间进行选择

sql里function 怎么调用

在查询条件下调用函数

xml 使用和不使用select属性演示相同查询结果之间的差异。

xml 使用和不使用select属性演示相同查询结果之间的差异。