Ce dont vous avez probablement besoin
Vous avez probablement besoin d'une fonction pour renvoyer text
et un autre pour retourner integer
ou une fonction qui renvoie boolean
pour indiquer le succès. Tout cela est trivial et je vous renvoie à l'excellent manuel sur CREATE FUNCTION
ou des exemples de code dans des questions similaires sur SO.
Ce que vous avez réellement demandé
Comment écrire une fonction qui renvoie du texte ou des valeurs entières ?
... dans le sens où nous en avons un le type de retour étant soit text
ou integer
. Pas aussi trivial, mais aussi pas impossible comme cela a été suggéré. Le mot clé est :types polymorphes .
S'appuyant sur ce tableau simple :
CREATE TABLE tbl(
tbl_id int,
txt text,
nr int
);
Cette fonction renvoie soit un entier, soit du texte (ou tout autre type si vous l'autorisez), selon le type d'entrée.
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;
Appel :
SELECT f_insert_data(1, 'foo'::text); -- explicit cast needed.
SELECT f_insert_data(1, 7);
Cas simple
Un fonction qui renvoie TRUE
/ FALSE
pour indiquer si une ligne a été insérée, un seul paramètre d'entrée de type variable :
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;
Le type d'entrée peut être remplacé par un text
paramètre dans la plupart des cas, qui peut être transtypé vers et depuis n'importe quel autre type.