Er zijn verschillende opties, afhankelijk van het volledige plaatje.
Kortom, uw invoegfunctie zou als volgt kunnen werken:
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;
Het rijtype van de weergave gebruiken , omdat NEW
in uw trigger is van dit type.
Gebruik een eenvoudige SQL-functie, die inline kan worden geplaatst en mogelijk beter presteert.
Demo-oproep:
SELECT insert_thing('(1, foo, 1, bar)');
Binnen je trigger flavored_trig ()
:
inserted_id := insert_thing(NEW);
Of eigenlijk herschreven:
IF TG_OP = 'INSERT' THEN
INSERT INTO flavored_things(thing_id, flavor)
VALUES (insert_thing(NEW), NEW.flavor);
RETURN NEW;
ELSIF ...
is geen geldig type buiten PL/pgSQL, het is gewoon een generieke tijdelijke aanduiding voor een nog onbekend rijtype in PL/pgSQL), dus je kunt het niet gebruiken voor een invoerparameter in een functiedeclaratie.record
Voor een meer dynamische functie die verschillende rijtypes accepteert je zou een kunnen gebruiken polymorf type . Voorbeelden:
- Hoe een tabel op rijtype teruggeven in PL/pgSQL
- Refactor een PL/pgSQL-functie om de uitvoer van verschillende SELECT-query's te retourneren
- Hoe schrijf je een functie die tekst of gehele getallen retourneert?