Das sollte einfach funktionieren. Die enum
sollte kein Problem sein. Getestet mit Postgres 9.1 und 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);
Außer ...
-
In Versionen vor 9.2 Sie können nur positionale (numerische) Parameter verwenden (
$1
) in SQL-Funktionen (im Gegensatz zu plpgsql-Funktionen).
In 9.2+ der Spaltenname würde Vorrang haben, sodassWHERE
-Klausel Ihres ursprünglichen Codes wäre immer TRUE und alle Zeilen würden sich qualifizieren - außer dass Ihre Funktion nur die erste zurückgibt, da sie keinenSETOF building_code
zurückgibt .
Benennen Sie entweder Ihren Parameter um oder verwenden Sie Positionsparameter oder vorzugsweise beides.
Wenn Sie widersprüchliche Parameternamen verwenden müssen, können Sie die Einstellung außer Kraft setzen, indem Sie den Funktionsnamen verwenden, um den Parameter zu qualifizieren. Wie:... WHERE v.id = room_code.id
-
Sie sollten den Typnamen nicht als Spaltennamen verwenden.
- Sie sollten keine Groß-/Kleinschreibung ohne Anführungszeichen wie
roomCode
verwenden , die in Kleinbuchstaben umgewandelt wird, es sei denn, Sie setzen doppelte Anführungszeichen:"roomCode"
.
->SQLfiddle mit 3 Varianten