Du är mycket bättre av att använda en INSTEAD OF INSERT
trigger här:
CREATE FUNCTION MyFuncName() RETURNS trigger AS $$
DECLARE
id integer;
BEGIN
INSERT INTO tableA (time) VALUES COALESCE(NEW.time, NOW()) RETURNING aPrimaryKey INTO id;
INSERT INTO tableB (aPrimaryKey, someCol1) VALUES (id, NEW.someValue);
RETURN NEW;
END; $$ LANGUAGE PLPGSQL;
CREATE TRIGGER MyView_on_insert INSTEAD OF INSERT ON MyView
FOR EACH ROW EXECUTE PROCEDURE MyFuncName();
Att kontrollera det aktuella värdet för en sekvens för att se vad som infogats i en annan tabell är dåligt dåligt dåligt öva. Även när du är här i en enda transaktion, gör det inte.
Du är förvirrad angående frågan om RETURNING
information, eftersom jag också blir förvirrad när jag läser din fråga. Inuti en funktion använd INTO
sats för att fylla i lokalt deklarerade variabler för att hålla postvärden som du sedan kan använda i efterföljande uttalanden. Utanför en funktion, använd RETURNING
som du gör i ditt översta kodavsnitt.