在 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的主要内容,如果未能解决你的问题,请参考以下文章