PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie übergebe ich einen Datensatz an eine PL/pgSQL-Funktion?

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 ...

record 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.

Für eine dynamischere Funktion, die verschiedene Zeilentypen akzeptiert Sie könnten einen verwenden polymorpher Typ . Beispiele: