在 PostgreSQL 函数中返回时使用 %rowtype

Posted

技术标签:

【中文标题】在 PostgreSQL 函数中返回时使用 %rowtype【英文标题】:Using %rowtype when returning in a PostgreSQL function 【发布时间】:2014-04-25 15:37:02 【问题描述】:

如果我有一个函数只返回一行,其中包含表中的一些列,我是否需要在函数返回声明中添加%rowtype

CREATE OR REPLACE FUNCTION test(int n)
RETURNS tableName%rowtype AS
$BODY$
DECLARE 
    r tableName%rowtype;    
BEGIN   
        select a,b,c into r from tableName where d=n;
        return r;
$BODY$
END;

【问题讨论】:

这看起来不对 - tableName%rowtype 应该包含 tableName 中的所有列,而不仅仅是您选择的那些。 【参考方案1】:

关于%ROWTYPE

%ROWTYPE 结构仅对可移植性有好处。很少有用,因为 PL/pgSQL 函数一开始就很难移植。如果您要使用它,它仅适用于 PL/pgSQL 中的变量声明函数,而不是声明 RETURN 类型,这实际上是外部 SQL 语法的一部分。

Per documentation:

(由于每个表都有一个关联的同名复合类型, 在 PostgreSQL 中你是否写 %ROWTYPE 实际上并不重要 或不。但是%ROWTYPE 的表单更便携。)

回答

这将实现您似乎正在尝试的目标:

CREATE OR REPLACE FUNCTION test_plpgsql(_n int)
  RETURNS tbl AS
$func$
BEGIN   
  RETURN (SELECT t FROM tbl t where tbl_id = _n); -- selecting the whole row
END
$func$ LANGUAGE plpgsql;

呼叫:

SELECT * FROM test_plpgsql(1);

但如果就这么简单,那就改用更简单的 SQL 函数吧:

CREATE OR REPLACE FUNCTION test_sql(_n int)
  RETURNS SETOF tbl AS
$func$
   SELECT * FROM tbl WHERE tbl_id = _n;  -- Requires Postgres 9.3; or use $1
$func$ LANGUAGE sql;

呼叫:

SELECT * FROM test_sql(1);

你原来的例子在很多地方都是扭曲和不正确的。搜索更多plpgsql 示例以掌握基本语法。

【讨论】:

以上是关于在 PostgreSQL 函数中返回时使用 %rowtype的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 在使用自定义类型时只返回一行

postgresql 函数返回结果集(zz)

在 PostgreSQL 中返回表的用户定义函数

PostgreSQL:使用窗口函数返回单行

PostgreSQL now()函数没有返回时间

在 PostgreSQL 中,如何创建一个返回实际表的函数? [复制]