Vad du förmodligen behöver
Troligtvis behöver du en funktion för att returnera text
och ytterligare en för att returnera integer
eller en funktion som returnerar boolean
för att indikera framgång. Allt detta är trivialt och jag hänvisar dig till den utmärkta manualen om CREATE FUNCTION
eller kodexempel i liknande frågor om SO.
Vad du faktiskt frågade
Hur skriver man en funktion som returnerar text- eller heltalsvärden?
... i den meningen att vi har en returtyp är antingen text
eller integer
. Inte så trivialt, men inte heller omöjligt som har föreslagits. Nyckelordet är:polymorfa typer .
Bygger på detta enkla bord:
CREATE TABLE tbl(
tbl_id int,
txt text,
nr int
);
Den här funktionen returnerar antingen heltal eller text (eller någon annan typ om du tillåter det), beroende på inmatningstypen.
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;
Ring:
SELECT f_insert_data(1, 'foo'::text); -- explicit cast needed.
SELECT f_insert_data(1, 7);
Enkelt fall
En funktion som returnerar TRUE
/ FALSE
för att indikera om en rad har infogats, endast en indataparameter av varierande typ:
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;
Inmatningstypen kan ersättas med en text
parameter för de flesta ändamål, som kan castas till och från vilken annan typ som helst.