PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como passar um registro para uma função PL/pgSQL?


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 não é um tipo válido fora de PL/pgSQL, é apenas um placeholder genérico para um tipo de linha ainda desconhecido em PL/pgSQL) então você não pode usá-lo para um parâmetro de entrada em uma declaração de função.

Para uma função mais dinâmica que aceita vários tipos de linha você pode usar um tipo polimórfico . Exemplos: