Това просто трябва да работи. 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 можете да използвате само позиционни (числови) параметри (
$1
) в SQL функции (за разлика от функциите plpgsql).
В 9.2+ името на колоната ще има предимство, така чеWHERE
клаузата на оригиналния ви код винаги ще бъде TRUE и всички редове ще отговарят на изискванията - с изключение на това, че вашата функция връща само първия, тъй като не връщаSETOF building_code
.
Или преименувайте параметъра си, или използвайте позиционен параметър, или за предпочитане и двете.
Ако трябва да използвате противоречиви имена на параметри, можете да отмените предпочитанието, като използвате името на функцията, за да квалифицирате параметъра. Като:... WHERE v.id = room_code.id
-
Не трябва да използвате името на типа като име на колона.
- Не трябва да използвате смесени имена без кавички като
roomCode
, който ще бъде сгънат до малки букви, освен ако не цитирате:"roomCode"
.
->SQLfiddle с 3 варианта