Det her burde bare virke. enum
burde ikke være et problem. Testet med Postgres 9.1 og 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);
Undtagen ...
-
I versioner før 9.2 du kan kun bruge positionelle (numeriske) parametre (
$1
) i SQL-funktioner (i modsætning til plpgsql-funktioner).
I 9.2+ kolonnenavnet ville have forrang, såWHERE
klausul i din oprindelige kode vil altid være TRUE, og alle rækker ville kvalificere sig - bortset fra at din funktion kun returnerer den første, da den ikke returnerer enSETOF building_code
.
Enten omdøb din parameter eller brug positionsparameter eller helst begge dele.
Hvis du skal bruge modstridende parameternavne, kan du tilsidesætte præferencen ved at bruge funktionsnavnet til at kvalificere parameteren. Ligesom:... WHERE v.id = room_code.id
-
Du bør ikke bruge typenavnet som kolonnenavn.
- Du bør ikke bruge navne med blandede store og små bogstaver uden anførselstegn som
roomCode
, som vil blive foldet til små bogstaver, medmindre du dobbeltciterer:"roomCode"
.
->SQLfiddle med 3 varianter