PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come passare un record a una funzione PL/pgSQL?

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 ...

record 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.

Per una funzione più dinamica che accetta vari tipi di riga potresti usare un tipo polimorfico . Esempi: