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"

我知道我可以定义一个类型,然后像游标一样遍历记录集,但是 IIRC 在更新版本的 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 [table name]”。但它似乎不是最灵活的。如果我尝试返回几个表的连接,它就会崩溃。

4

2 回答 2

15

还有使用的选项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;

这实际上与 using 相同SETOF tablename,但内联声明表结构而不是引用现有对象,因此连接等仍然有效。

于 2013-07-12T19:49:29.153 回答
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;
于 2010-01-10T10:13:26.613 回答