Isso deve funcionar. O
enum
Não deveria ser um problema. Testado com Postgres 9.1 e 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);
Exceto ...
-
Nas versões antes da 9.2 você só pode usar parâmetros posicionais (numéricos) ($1
) em funções SQL (ao contrário das funções plpgsql).
Em 9.2+ o nome da coluna teria precedência, para que oWHERE
cláusula do seu código original sempre seria TRUE e todas as linhas seriam qualificadas - exceto que sua função retorna apenas a primeira, pois ela não retorna umSETOF building_code
.
Renomeie seu parâmetro ou use o parâmetro posicional ou, de preferência, ambos.
Se você precisar usar nomes de parâmetro conflitantes, poderá substituir a preferência usando o nome da função para qualificar o parâmetro. Como:
... WHERE v.id = room_code.id
-
Você não deve usar o nome do tipo como nome da coluna.
- Você não deve usar nomes de maiúsculas e minúsculas sem aspas, como
roomCode
, que será dobrado para letras minúsculas, a menos que você coloque aspas duplas:"roomCode"
.
->SQLfiddle com 3 variantes