PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment écrire une fonction qui renvoie du texte ou des valeurs entières ?

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.