Dit zou gewoon moeten werken. De enum
mag geen probleem zijn. Getest met Postgres 9.1 en 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);
Behalve ...
-
In versies vóór 9.2 u kunt alleen positionele (numerieke) parameters . gebruiken (
$1
) in SQL-functies (in tegenstelling tot plpgsql-functies).
In 9.2+ de kolomnaam heeft voorrang, zodat deWHERE
clausule van uw oorspronkelijke code zou altijd TRUE zijn en alle rijen zouden in aanmerking komen - behalve dat uw functie alleen de eerste retourneert, omdat deze geenSETOF building_code
retourneert .
Hernoem uw parameter of gebruik positionele parameter of, bij voorkeur, beide.
Als u conflicterende parameternamen moet gebruiken, kunt u de voorkeur negeren door de functienaam te gebruiken om de parameter te kwalificeren. Vind ik leuk:... WHERE v.id = room_code.id
-
Gebruik de typenaam niet als kolomnaam.
- Gebruik geen niet-aangehaalde namen van hoofdletters en kleine letters, zoals
roomCode
, die naar kleine letters wordt gevouwen, tenzij u dubbel aanhaalt:"roomCode"
.
->SQLfiddle met 3 varianten