От какво вероятно се нуждаете
Най-вероятно имате нужда от една функция, за да върнете text
и още един за връщане на integer
или функция, която връща boolean
за да покаже успех. Всичко това е тривиално и ще ви препратя към отличното ръководство за CREATE FUNCTION
или примери за код в подобни въпроси на SO.
Какво всъщност попитахте
Как да напиша функция, която връща текстови или целочислени стойности?
... в смисъл, че имаме един типът на връщане е или text
или 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
параметър за повечето цели, който може да се прехвърля към и от всеки друг тип.