To powinno po prostu działać. enum
nie powinno być problemem. Testowane z Postgresem 9.1 i 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);
Z wyjątkiem ...
-
W wersjach przed 9.2 możesz używać tylko parametrów pozycyjnych (numerycznych) (
$1
) w funkcjach SQL (w przeciwieństwie do funkcji plpgsql).
W 9.2+ nazwa kolumny miałaby pierwszeństwo, więcWHERE
klauzula twojego oryginalnego kodu zawsze będzie TRUE i wszystkie wiersze będą się kwalifikować - z wyjątkiem tego, że twoja funkcja zwraca tylko pierwszy, ponieważ nie zwracaSETOF building_code
.
Zmień nazwę parametru lub użyj parametru pozycyjnego, a najlepiej obu.
Jeśli musisz użyć sprzecznych nazw parametrów, możesz zastąpić preferencję, używając nazwy funkcji do zakwalifikowania parametru. Na przykład:... WHERE v.id = room_code.id
-
Nie należy używać nazwy typu jako nazwy kolumny.
- Nie należy używać niecytowanych nazw mieszanych wielkości liter, takich jak
roomCode
, który zostanie złożony małymi literami, chyba że umieścisz cudzysłów:"roomCode"
.
->SQLfiddle z 3 wariantami