一尘不染

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

sql

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

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;

阅读 186

收藏
2021-03-17

共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

2021-03-17