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

时间:2014-04-25 15:37:03

标签: database postgresql plpgsql

如果我的函数只返回一行表中的某些列,我是否需要在函数返回声明中添加%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;

1 个答案:

答案 0 :(得分:9)

关于%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);

您的原始示例在太多地方扭曲且不正确。搜索更多示例以掌握基本语法。