Du er meget bedre stillet med en INSTEAD OF INSERT
trigger her:
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();
At kontrollere den aktuelle værdi af en sekvens for at se, hvad der blev indsat i en anden tabel, er dårlig dårlig dårlig øve sig. Selv mens du er her i en enkelt transaktion, skal du ikke gøre det.
Du er forvirret over spørgsmålet om RETURNING
information, for jeg bliver også forvirret, når jeg læser dit spørgsmål. Brug INTO
inde i en funktion klausul til at udfylde lokalt erklærede variabler til at indeholde postværdier, som du derefter kan bruge i efterfølgende udsagn. Uden for en funktion skal du bruge RETURNING
klausul, som du gør i dit øverste kodestykke.