如果我的函数只返回一行表中的某些列,我是否需要在函数返回声明中添加%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;
答案 0 :(得分:9)
%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;
呼叫:
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示例以掌握基本语法。