Existem várias opções, dependendo da imagem completa.
Basicamente, sua função de inserção pode funcionar assim:
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;
Usando o tipo de linha da visualização , porque
NEW
em seu gatilho é desse tipo.Use uma função SQL simples, que pode ser embutida e pode ter um desempenho melhor.
Chamada de demonstração:
SELECT insert_thing('(1, foo, 1, bar)');
Dentro do seu gatilho
flavored_trig ()
:inserted_id := insert_thing(NEW);
Ou, basicamente, reescrito:
IF TG_OP = 'INSERT' THEN
INSERT INTO flavored_things(thing_id, flavor)
VALUES (insert_thing(NEW), NEW.flavor);
RETURN NEW;
ELSIF ...
record
Para uma função mais dinâmica que aceita vários tipos de linha você pode usar um tipo polimórfico . Exemplos:
- Como retornar uma tabela por tipo de linha em PL/pgSQL
- Refatorar uma função PL/pgSQL para retornar a saída de várias consultas SELECT
- Como escrever uma função que retorne valores de texto ou inteiros?