Je nach Gesamtbild gibt es verschiedene Möglichkeiten.
Im Grunde könnte Ihre Einfügefunktion so funktionieren:
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;
Verwendung des Zeilentyps der Ansicht , weil NEW
in Ihrem Trigger ist von diesem Typ.
Verwenden Sie eine einfache SQL-Funktion, die eingebettet werden kann und möglicherweise eine bessere Leistung erbringt.
Demoaufruf:
SELECT insert_thing('(1, foo, 1, bar)');
Innerhalb Ihres Triggers flavored_trig ()
:
inserted_id := insert_thing(NEW);
Oder grundlegend umgeschrieben:
IF TG_OP = 'INSERT' THEN
INSERT INTO flavored_things(thing_id, flavor)
VALUES (insert_thing(NEW), NEW.flavor);
RETURN NEW;
ELSIF ...
ist außerhalb von PL/pgSQL kein gültiger Typ, sondern nur ein generischer Platzhalter für einen noch unbekannten Zeilentyp in PL/pgSQL), sodass Sie ihn nicht für einen Eingabeparameter in einer Funktionsdeklaration verwenden können.record
Für eine dynamischere Funktion, die verschiedene Zeilentypen akzeptiert Sie könnten einen verwenden polymorpher Typ . Beispiele:
- Wie man eine Tabelle nach Zeilentyp in PL/pgSQL zurückgibt
- Refaktorisieren Sie eine PL/pgSQL-Funktion, um die Ausgabe verschiedener SELECT-Abfragen zurückzugeben
- Wie schreibe ich eine Funktion, die Text- oder Ganzzahlwerte zurückgibt?