PostgreSQL返回一个具有自定义数据类型的函数

时间:2013-08-14 15:10:54

标签: sql function postgresql plpgsql

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

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;

1 个答案:

答案 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个变种