Co pravděpodobně potřebujete
Pravděpodobně budete potřebovat jednu funkci, která vrátí text
a další pro návrat integer
nebo funkce, která vrací boolean
naznačit úspěch. To vše je triviální a já vás odkážu na vynikající příručku o CREATE FUNCTION
nebo příklady kódu v podobných otázkách na SO.
Na co jste se vlastně ptal
Jak napsat funkci, která vrací textové nebo celočíselné hodnoty?
... v tom smyslu, že máme jeden návratový typ je buď text
nebo integer
. Ne tak triviální, ale také ne nemožné, jak bylo naznačeno. Klíčové slovo je:polymorfní typy .
Na základě tohoto jednoduchého stolu:
CREATE TABLE tbl(
tbl_id int,
txt text,
nr int
);
Tato funkce vrací buď celé číslo nebo text (nebo jakýkoli jiný typ, pokud to povolíte), v závislosti na typu vstupu.
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;
Volejte:
SELECT f_insert_data(1, 'foo'::text); -- explicit cast needed.
SELECT f_insert_data(1, 7);
Jednoduchý případ
Jedna funkce, která vrací TRUE
/ FALSE
pro označení, zda byl vložen řádek, pouze jeden vstupní parametr různého 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 vstupu lze nahradit text
parametr pro většinu účelů, který lze přetypovat do az jakéhokoli jiného typu.