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

Comment passer un enregistrement à une fonction PL/pgSQL ?

Il existe différentes options, en fonction de l'image complète.
En gros, votre fonction d'insertion pourrait fonctionner comme ceci :

CREATE FUNCTION insert_thing (_thing flavored_view)
   RETURNS int AS
$func$
   INSERT INTO things (name) VALUES ($1.name) -- plus 30 more columns
   RETURNING id;
$func$ LANGUAGE sql;

Utilisation du type de ligne de la vue , car NEW dans votre déclencheur est de ce type.
Utilisez une fonction SQL simple, qui peut être intégrée et pourrait être plus performante.

Appel de démonstration :

SELECT insert_thing('(1, foo, 1, bar)');

À l'intérieur de votre déclencheur flavored_trig () :

inserted_id := insert_thing(NEW);

Ou, essentiellement réécrit :

IF TG_OP = 'INSERT' THEN
   INSERT INTO flavored_things(thing_id, flavor)
   VALUES (insert_thing(NEW), NEW.flavor);
   RETURN NEW;
ELSIF ...

record n'est pas un type valide en dehors de PL/pgSQL, c'est juste un espace réservé générique pour un type de ligne encore inconnu dans PL/pgSQL) donc vous ne pouvez pas l'utiliser pour un paramètre d'entrée dans une déclaration de fonction.

Pour une fonction plus dynamique acceptant différents types de lignes vous pouvez utiliser un type polymorphe . Exemples :