Vous feriez bien mieux d'utiliser un INSTEAD OF INSERT
déclencheur ici :
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();
Vérifier la valeur actuelle d'une séquence pour voir ce qui a été inséré dans une autre table est mauvais mauvais mauvais pratique. Même pendant que vous êtes ici dans une seule transaction, ne le faites pas.
Vous êtes confus au sujet de la question de RETURNING
informations, parce que je suis confus aussi quand je lis votre question. À l'intérieur d'une fonction, utilisez le INTO
clause pour remplir les variables déclarées localement afin de conserver les valeurs d'enregistrement que vous pouvez ensuite utiliser dans les instructions suivantes. En dehors d'une fonction, utilisez le RETURNING
clause comme vous le faites dans votre extrait de code le plus élevé.