【问题标题】:Using %rowtype when returning in a PostgreSQL function在 PostgreSQL 函数中返回时使用 %rowtype
【发布时间】: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 中的所有列,而不仅仅是您选择的那些。

标签: database postgresql plpgsql


【解决方案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);

你原来的例子在很多地方都是扭曲和不正确的。搜索更多 示例以掌握基本语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2017-02-08
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    相关资源
    最近更新 更多