1

如何调用在 FROM 子句中多次返回记录的函数?我了解在使用返回记录的函数时必须指定“列定义列表”。但是我怎样才能为该功能使用别名呢?

例子:

CREATE OR REPLACE FUNCTION foo(which_foo int) RETURNS SETOF RECORD AS
$BODY$BEGIN
IF which_foo=0 THEN
 RETURN QUERY EXECUTE 'SELECT 1::int,2::int;';
ELSE 
 RETURN QUERY EXECUTE 'SELECT 1::int,2::int;';
END IF;
END$BODY$
LANGUAGE plpgsql;

SELECT * FROM foo(0) AS (a int, b int);;
SELECT * FROM foo(1) AS (c int, d int);
SELECT * FROM foo(0) AS (a int, b int), foo(1) AS (c int, d int);

最后一个 select 语句将失败,并显示:

ERROR:  table name "foo" specified more than once

我想继续使用列定义列表,因为我最终要使用的函数必须尽可能通用。

4

2 回答 2

2
SELECT f0.*, f1.*
FROM
    foo(0) AS f0 (a int, b int),
    foo(1) AS f1 (c int, d int);
于 2013-05-20T17:18:27.657 回答
0

我了解在使用返回记录的函数时必须指定“列定义列表”。

你不可以。我不会使用匿名记录进行操作。声明返回类型,因为你已经知道了:

CREATE OR REPLACE FUNCTION foo(which_foo int)
 RETURNS TABLE (a int, b int) AS
$func$
BEGIN
    IF which_foo = 0 THEN
        RETURN QUERY SELECT 1,2;
    ELSE 
        RETURN QUERY SELECT 1,2;
    END IF;
END
$func$ LANGUAGE plpgsql;

并且假设您不想将多个调用合并到一行中,您应该使用UNION ALL

SELECT * FROM foo(0)
UNION ALL
SELECT * FROM foo(1);
于 2013-05-20T17:31:17.340 回答