我想创建一个返回我创建的类型的函数,但是当我执行它时,它说该类型不存在。我认为这是因为它对自定义类型一无所知。
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;
这应该工作。该enum应该不是问题。经过Postgres 9.1和9.2测试
enum
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。 重命名您的参数或使用位置参数,或者最好同时使用两者。 如果必须使用冲突的参数名称,则可以使用函数名称来限定参数,从而覆盖首选项。喜欢:
$1
WHERE
SETOF building_code
... WHERE v.id = room_code.id
您不应将类型名称用作列名称。
roomCode除非使用双引号:,否则请勿使用不带引号的大小写混合的名称,例如,该名称将被折叠为小写"roomCode"。
roomCode
"roomCode"
- >具有3个变体的 SQLfiddle