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 ...
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.record
Para una función más dinámica que acepte varios tipos de fila podría usar un tipo polimórfico . Ejemplos:
- Cómo devolver una tabla por tipo de fila en PL/pgSQL
- Refactorizar una función PL/pgSQL para devolver el resultado de varias consultas SELECT
- ¿Cómo escribir una función que devuelva texto o valores enteros?