Czego prawdopodobnie potrzebujesz
Najprawdopodobniej potrzebujesz jednej funkcji, aby zwrócić text
a drugi zwraca integer
lub funkcja zwracająca boolean
aby wskazać sukces. Wszystko to jest trywialne i odsyłam cię do doskonałego podręcznika CREATE FUNCTION
lub przykłady kodu w podobnych pytaniach na SO.
O co właściwie pytałeś
Jak napisać funkcję, która zwraca tekst lub wartości całkowite?
... w tym sensie, że mamy jeden zwracany typ to text
lub integer
. Nie tak trywialne, ale też nie niemożliwe, jak sugerowano. Kluczowym słowem jest:typy polimorficzne .
Opierając się na tej prostej tabeli:
CREATE TABLE tbl(
tbl_id int,
txt text,
nr int
);
Ta funkcja zwraca liczbę całkowitą lub tekst (lub dowolny inny typ, jeśli na to zezwolisz), w zależności od typu danych wejściowych.
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;
Zadzwoń:
SELECT f_insert_data(1, 'foo'::text); -- explicit cast needed.
SELECT f_insert_data(1, 7);
Prosty przypadek
Jeden funkcja zwracająca TRUE
/ FALSE
aby wskazać, czy wstawiono wiersz, tylko jeden parametr wejściowy różnego typu:
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;
Typ wejścia można zastąpić text
parametr dla większości celów, który może być rzutowany do iz dowolnego innego typu.