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

Dou*_*las 4 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;
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 10

关于 %ROWTYPE

%ROWTYPE构造仅适用于便携性.非常有用,因为PL/pgSQL函数很难开始使用.
如果你打算使用它,它只适用于PL/pgSQL函数内的变量声明,而不是声明RETURN类型,这实际上是外部SQL语法的一部分.

每个文件:

(由于每个表都有一个相同名称的关联复合类型,因此无论你是否编写,它在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;
Run Code Online (Sandbox Code Playgroud)

呼叫:

SELECT * FROM test_plpgsql(1);
Run Code Online (Sandbox Code Playgroud)

但如果它就这么简单,请使用更简单的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;
Run Code Online (Sandbox Code Playgroud)

呼叫:

SELECT * FROM test_sql(1);
Run Code Online (Sandbox Code Playgroud)

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