Những gì bạn có thể cần
Nhiều khả năng bạn cần một hàm để trả về text
và một số khác để trả về integer
hoặc một hàm trả về boolean
để biểu thị sự thành công. Tất cả những điều này thật tầm thường và tôi sẽ giới thiệu cho bạn hướng dẫn tuyệt vời về CREATE FUNCTION
hoặc mã ví dụ trong các câu hỏi tương tự trên SO.
Những gì bạn thực sự đã hỏi
Làm cách nào để viết một hàm trả về giá trị văn bản hoặc số nguyên?
... theo nghĩa là chúng ta có một kiểu trả về là text
hoặc integer
. Không phải là tầm thường, nhưng cũng không phải là không thể như đã được đề xuất. Từ khóa là: loại đa hình .
Xây dựng trên bảng đơn giản này:
CREATE TABLE tbl(
tbl_id int,
txt text,
nr int
);
Hàm này trả về số nguyên hoặc văn bản (hoặc bất kỳ kiểu nào khác nếu bạn cho phép), tùy thuộc vào kiểu đầu vào.
CREATE FUNCTION f_insert_data(_id int, _data anyelement, OUT _result anyelement)
RETURNS anyelement AS
$func$
BEGIN
CASE pg_typeof(_data)
WHEN 'text'::regtype THEN
INSERT INTO tbl(tbl_id, txt) VALUES(_id, _data)
RETURNING txt
INTO _result;
WHEN 'integer'::regtype THEN
INSERT INTO tbl(tbl_id, nr) VALUES(_id, _data)
RETURNING nr
INTO _result;
ELSE
RAISE EXCEPTION 'Unexpected data type: %', pg_typeof(_data)::text;
END CASE;
END
$func$
LANGUAGE plpgsql;
Gọi:
SELECT f_insert_data(1, 'foo'::text); -- explicit cast needed.
SELECT f_insert_data(1, 7);
Trường hợp đơn giản
Một hàm trả về TRUE
/ FALSE
để cho biết một hàng đã được chèn hay chưa, chỉ một tham số đầu vào thuộc loại khác nhau:
CREATE FUNCTION f_insert_data2(_id int, _data anyelement)
RETURNS boolean AS
$func$
BEGIN
CASE pg_typeof(_data)
WHEN 'text'::regtype THEN
INSERT INTO tbl(tbl_id, txt) VALUES(_id, _data);
WHEN 'integer'::regtype THEN
INSERT INTO tbl(tbl_id, nr) VALUES(_id, _data);
ELSE
RAISE EXCEPTION 'Unexpected data type: >>%<<', pg_typeof(_data)::text;
END CASE;
IF FOUND THEN RETURN TRUE;
ELSE RETURN FALSE;
END IF;
END
$func$
LANGUAGE plpgsql;
Loại đầu vào có thể được thay thế bằng text
cho hầu hết các mục đích, có thể được truyền đến và từ bất kỳ loại nào khác.