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)
您的原始示例在太多地方扭曲且不正确.搜索更多plpgsql示例以掌握基本语法.