从PostgreSQL存储过程中返回记录集的最简单方法是什么?

9

我有一张包含国家和它们的ISO国家代码列表的表格。我将查询封装在一个存储过程(也称为函数)中,例如:

CREATE OR REPLACE FUNCTION get_countries(
                    ) RETURNS setof record AS $$
        SELECT country_code, country_name FROM country_codes
$$ LANGUAGE sql;

我收到的错误信息是:
ERROR:  a column definition list is required for functions returning "record"

我知道可以定义一个TYPE,然后像游标一样遍历记录集,但是在较新版本的PostgreSQL中(我使用的是8.4.3),有更好的方法来处理此问题,但是我正在绞尽脑汁想要记起来。

编辑:

这个可行:

CREATE OR REPLACE FUNCTION get_countries(
                    ) RETURNS setof country_codes AS $$
        SELECT country_code, country_name FROM country_codes
$$ LANGUAGE sql;

请注意 "RETURNS setof [表名]"。但这似乎不是最灵活的。如果我尝试返回几个表的连接,它就会崩溃。


可能是在PL/pgSQL中声明记录的元组结构的重复问题。 - Erwin Brandstetter
2个回答

16

还有一种选项是使用RETURNS TABLE(...)(如PostgreSQL手册中所述),我个人比较喜欢这种方式:

CREATE OR REPLACE FUNCTION get_countries()
RETURNS TABLE(
    country_code text,
    country_name text
)
AS $$
    SELECT country_code, country_name FROM country_codes
$$ LANGUAGE sql;

这与使用 SETOF tablename 的效果相同,但是它内联声明了表结构而不是引用现有对象,因此联接等操作仍将起作用。


11

你应该能够使用输出参数,像这样:

CREATE OR REPLACE FUNCTION get_countries(country_code OUT text, country_name OUT text)
RETURNS setof record
AS $$ SELECT country_code, country_name FROM country_codes $$
LANGUAGE sql;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接