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 ...
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.record
Pour une fonction plus dynamique acceptant différents types de lignes vous pouvez utiliser un type polymorphe . Exemples :
- Comment retourner une table par type de ligne en PL/pgSQL
- Refactoriser une fonction PL/pgSQL pour renvoyer la sortie de diverses requêtes SELECT
- Comment écrire une fonction qui renvoie du texte ou des valeurs entières ?