2014-10-04 74 views
2

请看下面的例子功能:在PostgreSQL的SQL函数的多个结果掷错误

CREATE FUNCTION test() 
    RETURNS INTEGER 
    LANGUAGE SQL 
    AS $$ SELECT * FROM UNNEST(ARRAY[1,2,3,4,5]); $$ 
; 

当我们执行它像这样:

SELECT test(); 

结果我们得到的回复是1。换句话说,函数刚刚返回结果集的第一个元素。

我有一个方便的功能,它根据行的其余部分的数据检索一个ID。它允许呼叫者查询通常对特定行唯一的数据,但不是严格唯一。首先,它将被用来填充一些大部分是静态的数据。允许调用使用行数据而不是硬编码,这使得ID在新数据出现时更具可读性和更易于维护。这取决于调用者对数据有一定的熟悉程度,但这是一个合理的假设,可以用于手头的使用。

问题是,如果用户犯了一个错误,并给出的参数不足以将查询的结果过滤到一行,我希望我的函数出错而不是返回第一个结果。我怎样才能做到这一点?除了将我的语言切换到PL/PGSQL并手动检查之外,我还有其他选择吗?

(使用PostgreSQL 9.3)。

回答

3

您可以将整个查询作为子查询放入SELECT列表中。当试图返回多行,这将失败,此错误:

ERROR: more than one row returned by a subquery used as an expression

根据您的例子,这一次会失败:

CREATE FUNCTION test() 
    RETURNS INTEGER 
    LANGUAGE SQL 
    AS $$ SELECT (SELECT * FROM UNNEST(ARRAY[1,2,3,4,5])); $$ 

,这一次也不会失败:

CREATE FUNCTION test() 
    RETURNS INTEGER 
    LANGUAGE SQL 
    AS $$ SELECT (SELECT * FROM UNNEST(ARRAY[1])); $$