sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo pasar un registro a una función PL/pgSQL?

Hay varias opciones, dependiendo de la imagen completa.
Básicamente, su función de inserción podría funcionar así:

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 el tipo de fila de la vista , porque NEW en su disparador es de este tipo.
Use una función SQL simple, que puede estar en línea y podría funcionar mejor.

Llamada de demostración:

SELECT insert_thing('(1, foo, 1, bar)');

Dentro de su disparador flavored_trig () :

inserted_id := insert_thing(NEW);

O, básicamente reescrito:

IF TG_OP = 'INSERT' THEN
   INSERT INTO flavored_things(thing_id, flavor)
   VALUES (insert_thing(NEW), NEW.flavor);
   RETURN NEW;
ELSIF ...

record no es un tipo válido fuera de PL/pgSQL, es solo un marcador de posición genérico para un tipo de fila aún desconocido en PL/pgSQL), por lo que no puede usarlo como parámetro de entrada en una declaración de función.

Para una función más dinámica que acepte varios tipos de fila podría usar un tipo polimórfico . Ejemplos: