Ini hanya harus bekerja. enum
seharusnya tidak menjadi masalah. Diuji dengan Postgres 9.1 dan 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);
Kecuali ...
-
Dalam versi sebelum 9.2 Anda hanya dapat menggunakan parameter posisi (numerik) (
$1
) dalam fungsi SQL (tidak seperti fungsi plpgsql).
Dalam 9.2+ nama kolom akan didahulukan, sehinggaWHERE
klausa kode asli Anda akan selalu BENAR dan semua baris akan memenuhi syarat - kecuali bahwa fungsi Anda hanya mengembalikan yang pertama, karena tidak mengembalikanSETOF building_code
.
Mengganti nama parameter Anda atau menggunakan parameter posisi atau, lebih disukai, keduanya.
Jika Anda harus menggunakan nama parameter yang bertentangan, Anda dapat mengganti preferensi dengan menggunakan nama fungsi untuk memenuhi syarat parameter. Seperti:... WHERE v.id = room_code.id
-
Anda tidak boleh menggunakan nama jenis sebagai nama kolom.
- Anda tidak boleh menggunakan nama kasus campuran yang tidak dikutip seperti
roomCode
, yang akan dilipat menjadi huruf kecil, kecuali jika Anda mengutip dua kali:"roomCode"
.
->SQLfiddle dengan 3 varian