0

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

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;
4

1 回答 1

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 函数中使用位置(数字)参数( $1)(与 plpgsql 函数不同)。
    9.2+中,列名将优先,因此WHERE您的原始代码的子句将始终为 TRUE 并且所有行都符合条件 - 除了您的函数仅返回第一个,因为它不返回 a SETOF building_code
    重命名您的参数或使用位置参数,或者最好同时使用两者。
    如果您必须使用冲突的参数名称,您可以通过使用函数名称来限定参数来覆盖首选项。像:

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

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

->具有 3 个变体的SQLfiddle

于 2013-08-14T15:27:46.077 回答