你可能需要什么
很可能您需要一个函数返回text
,另一个函数返回,integer
或者返回一个boolean
表示成功的函数。所有这些都是微不足道的,我将向您推荐关于 SO 类似问题的优秀手册CREATE FUNCTION
或代码示例。
你实际上问了什么
如何编写一个返回文本或整数值的函数?
...从某种意义上说,我们有一个返回类型是text
or integer
。不像建议的那样微不足道,但也不是不可能的。关键词是:多态类型。
建立在这张简单的桌子上:
CREATE TABLE tbl(
tbl_id int,
txt text,
nr int
);
此函数根据输入类型返回整数或文本(或任何其他类型,如果您允许的话)。
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;
称呼:
SELECT f_insert_data(1, 'foo'::text); -- explicit cast needed.
SELECT f_insert_data(1, 7);
简单案例
一个函数返回TRUE
/FALSE
表示是否插入了一行,只有一个不同类型的输入参数:
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;
在大多数情况下,输入类型可以替换为text
参数,该参数可以转换为任何其他类型。