【问题标题】:PostgreSQL return a function with a Custom Data TypePostgreSQL 返回一个自定义数据类型的函数
【发布时间】:2013-08-16 15:03:57
【问题描述】:

我想创建一个返回我创建的类型的函数,但是当我执行它时,它说该类型不存在。我认为这是因为它不知道自定义类型。

UDT:

CREATE TYPE building_code AS ENUM ('IT','EMS','HSB','ENG');

功能:

 CREATE FUNCTION roomCode(id int ) RETURNS building_code AS 
$$
 SELECT building_code FROM venue as v WHERE id = v.id;
$$ LANGUAGE SQL;

【问题讨论】:

  • 缺少:Postgres 版本、逐字错误消息、表定义。
  • 你的列名与你输入的完全一样——我建议避免这种情况

标签: sql function postgresql plpgsql


【解决方案1】:

这应该可以工作。 enum 应该不是问题。使用 Postgres 9.1 和 9.2 测试

CREATE TYPE building_code AS ENUM ('IT','EMS','HSB','ENG');
CREATE TEMP TABLE venue (id int PRIMARY KEY, building_code building_code);
INSERT INTO venue VALUES (1, 'ENG');

CREATE OR REPLACE FUNCTION room_code(_id int) --!
  RETURNS building_code AS 
$func$
SELECT building_code FROM venue v WHERE v.id = $1 -- !
$func$ LANGUAGE SQL;

SELECT * FROM room_code(1);

除了 ...

  • 在 9.2 之前的版本中,您只能在 SQL 函数中使用 positional (numeric) parameters ($1)(与 plpgsql 函数不同)。
    在 9.2+ 中,列名优先,因此您的原始代码的 WHERE 子句将始终为 TRUE,并且所有行都符合条件 - 除了您的函数只返回第一个,因为它确实不返回SETOF building_code。
    重命名您的参数或使用位置参数,或者最好同时使用两者。
    如果您必须使用冲突的参数名称,您可以通过使用函数名称来限定参数来覆盖首选项。喜欢:

    ... WHERE v.id = room_code.id
    
  • 不应使用类型名称作为列名。

  • 您不应使用不带引号的混合大小写名称,例如 roomCode,它将被折叠成小写,除非您使用双引号:"roomCode"。

->SQLfiddle 有 3 个变体

【讨论】:

  • select ... from venue where v.id = id 是否会将未别名的 id 视为参数或来自场所的列?
  • @RomanPekar:好点。在 9.2 之前的版本中,您不能使用参数名称根本。只有位置参数。在 9.2+ 中,列名优先。我修改了答案。
  • 谢谢@ErwinBrandstetter,所以您可以使用位置参数或重命名参数。会知道的:)
猜你喜欢
  • 2011-01-03
  • 2013-07-05
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多