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

PostgreSQL返回具有自定义数据类型的函数,sql,function,postgresql,plpgsql,Sql,Function,Postgresql,Plpgsql,我想创建一个返回我创建的类型的函数,但当我执行它时,它会说该类型不存在。我想这是因为它不知道自定义类型 UDT: 功能: 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进行测试 CREATE TYPE

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

UDT:

功能:

 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进行测试

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

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

  • 您不应该使用未加引号的混合大小写名称,如
    roomCode
    ,它们将被折叠成小写,除非您双引号:
    “roomCode”

缺少3个变体:Postgres版本、逐字记录错误消息、表定义。您的列名与键入的列名完全相同-我建议避免这样做
选择。。。来自场馆,其中v.id=id
将把未关联的id视为参数或场馆的列?@RomanPekar:这一点很好。在9.2之前的版本中,根本不能使用参数名称。仅限位置参数。在9.2+中,列名优先。我修改了我的答案。谢谢,@ErwinBrandstetter,所以您可以使用位置参数或重命名参数。你会知道:)
... WHERE v.id = room_code.id