Det finns olika alternativ, beroende på hela bilden.
I grund och botten kan din infogningsfunktion fungera så här:
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;
Använda radtypen för vyn , eftersom NEW
i din utlösare är av den här typen.
Använd en enkel SQL-funktion, som kan infogas och kanske fungerar bättre.
Demosamtal:
SELECT insert_thing('(1, foo, 1, bar)');
Inuti din trigger flavored_trig ()
:
inserted_id := insert_thing(NEW);
Eller, i princip omskriven:
IF TG_OP = 'INSERT' THEN
INSERT INTO flavored_things(thing_id, flavor)
VALUES (insert_thing(NEW), NEW.flavor);
RETURN NEW;
ELSIF ...
är inte en giltig typ utanför PL/pgSQL, det är bara en generisk platshållare för en ännu okänd radtyp i PL/pgSQL) så du kan inte använda den för en indataparameter i en funktionsdeklaration.record
För en mer dynamisk funktion som accepterar olika radtyper du kan använda en polymorf typ . Exempel:
- Hur man returnerar en tabell efter radtyp i PL/pgSQL
- Refaktorera en PL/pgSQL-funktion för att returnera utdata från olika SELECT-frågor
- Hur skriver man en funktion som returnerar text- eller heltalsvärden?