我想创建一个返回我所做类型的函数,但是当我执行它时,它表示该类型不存在。我认为这是因为它不知道自定义类型。
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;
答案 0 :(得分: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"
之类的未加引号的混合大小写的名称,除非您使用双引号:{{1}}。->SQLfiddle有3个变种