sql >> Base de Datos >  >> RDS >> PostgreSQL

Regla de inserción en vista de Postgres con cláusula de retorno

Es mucho mejor usar un INSTEAD OF INSERT desencadenar aquí:

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();

Verificar el valor actual de una secuencia para ver qué se insertó en otra tabla es malo malo malo práctica. Incluso mientras esté aquí en una sola transacción, no lo haga.

Estás confundido sobre el problema de RETURNING información, porque yo también estoy confundido cuando leo tu pregunta. Dentro de una función usa INTO cláusula para llenar variables declaradas localmente para contener valores de registro que luego puede usar en declaraciones posteriores. Fuera de una función, use el RETURNING cláusula como lo hace en su fragmento de código superior.