Ci sono varie opzioni, a seconda del quadro completo.
Fondamentalmente, la tua funzione di inserimento potrebbe funzionare in questo modo:
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;
Utilizzando il tipo di riga della vista , perché NEW
nel tuo trigger è di questo tipo.
Utilizza una semplice funzione SQL, che può essere incorporata e potrebbe funzionare meglio.
Chiamata dimostrativa:
SELECT insert_thing('(1, foo, 1, bar)');
Dentro il tuo trigger flavored_trig ()
:
inserted_id := insert_thing(NEW);
Oppure, sostanzialmente riscritto:
IF TG_OP = 'INSERT' THEN
INSERT INTO flavored_things(thing_id, flavor)
VALUES (insert_thing(NEW), NEW.flavor);
RETURN NEW;
ELSIF ...
non è un tipo valido al di fuori di PL/pgSQL, è solo un segnaposto generico per un tipo di riga ancora sconosciuto in PL/pgSQL), quindi non puoi usarlo per un parametro di input in una dichiarazione di funzione.record
Per una funzione più dinamica che accetta vari tipi di riga potresti usare un tipo polimorfico . Esempi:
- Come restituire una tabella per tipo di riga in PL/pgSQL
- Refactoring di una funzione PL/pgSQL per restituire l'output di varie query SELECT
- Come si scrive una funzione che restituisce testo o valori interi?