Điều này sẽ chỉ hoạt động. enum
Không thanh vân đê. Đã kiểm tra với Postgres 9.1 và 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);
Ngoại trừ ...
-
Trong các phiên bản trước 9.2 bạn chỉ có thể sử dụng tham số vị trí (số) (
$1
) trong các hàm SQL (không giống như các hàm plpgsql).
Trong 9.2+ tên cột sẽ được ưu tiên, vì vậyWHERE
mệnh đề của mã ban đầu của bạn sẽ luôn là TRUE và tất cả các hàng sẽ đủ điều kiện - ngoại trừ việc hàm của bạn chỉ trả về giá trị đầu tiên, vì nó không trả vềSETOF building_code
.
Đổi tên tham số của bạn hoặc sử dụng tham số vị trí hoặc tốt nhất là cả hai.
Nếu bạn phải sử dụng tên tham số xung đột, bạn có thể ghi đè tùy chọn bằng cách sử dụng tên hàm để đủ điều kiện cho tham số. Như:... WHERE v.id = room_code.id
-
Bạn không nên sử dụng tên loại làm tên cột.
- Bạn không nên sử dụng các tên viết hoa hỗn hợp không được trích dẫn như
roomCode
, sẽ được xếp thành chữ thường, trừ khi bạn trích dẫn kép:"roomCode"
.
-> SQLfiddle với 3 biến thể