Tengo un problema con mi gatillo:
CREATE OR REPLACE FUNCTION process_fillDerivedFrom_used() RETURNS TRIGGER AS $fillDerivedFrom_used$ DECLARE prog varchar(255); current varchar(255); BEGIN SELECT u.iduseentity as prog ,g.idCreatedEntity as current FROM entity e JOIN used u ON e.identity=u.iduseentity JOIN activity a ON a.idactivity=u.idusedactivity JOIN generatedby g ON g.idcreatoractivity=a.idactivity INSERT INTO DERIVEDFROM VALUES (prog,current) END; $fillDerivedFrom_used$ LANGUAGE plpgsql; CREATE TRIGGER fillDerivedFrom_used AFTER INSERT OR UPDATE OR DELETE ON emp FOR EACH ROW EXECUTE PROCEDURE process_fillDerivedFrom_used();Uso 3 tablas, la consulta es correcta, así que creo que el error no viene de aquí. Pero cuando copio más allá de este disparador en mi terminal, no pasa nada, no hay mensaje de error, puedo escribir en la terminal pero no puedo ejecutar ninguna consulta, como si hubiera olvidado algo en mi disparador, así que creo que no está completamente creado, creo.
Creo que mezclo 2 lenguajes PL/SQL que aprendí en la escuela y el postgresql.
Gracias por tu ayuda
No se que problemas tienes. Uno es obvio. as no se utiliza para variables; into es. Además, debe nombrar las variables para que no entren en conflicto con los nombres de las columnas:
CREATE OR REPLACE FUNCTION process_fillDerivedFrom_used() RETURNS TRIGGER AS $fillDerivedFrom_used$ DECLARE prog v_varchar(255); current v_varchar(255); BEGIN SELECT u.iduseentity as prog, g.idCreatedEntity as current INTO v_proc, v_current FROM entity e JOIN used u ON e.identity = u.iduseentity JOIN activity a ON a.idactivity = u.idusedactivity JOIN generatedby g ON g.idcreatoractivity = a.idactivity INSERT INTO DERIVEDFROM VALUES (v_prog, v_current) END;Por supuesto, esto plantea la pregunta de por qué está usando variables:
CREATE OR REPLACE FUNCTION process_fillDerivedFrom_used() RETURNS TRIGGER AS $fillDerivedFrom_used$ BEGIN INSERT INTO DERIVEDFROM (prog, current) -- or whatever the column names are SELECT u.iduseentity as prog, g.idCreatedEntity as current FROM entity e JOIN used u ON e.identity = u.iduseentity JOIN activity a ON a.idactivity = u.idusedactivity JOIN generatedby g ON g.idcreatoractivity = a.idactivity; END;Lo he hecho y funciona, ¡gracias por tu ayuda!
CREATE OR REPLACE FUNCTION process_fillDerivedFromGenby() RETURNS TRIGGER AS $fillDerivedFromgenby$ DECLARE prog varchar(255); curent varchar(255); BEGIN SELECT u.iduseentity , g.idCreatedEntity into prog,curent FROM entity e JOIN used u ON e.identity=u.iduseentity JOIN activity a ON a.idactivity=u.idusedactivity JOIN generatedby g ON g.idcreatoractivity=a.idactivity WHERE g.idCreatedEntity =NEW.idCreatedEntity; --raise notice 'curent: "%" prog by "%"', curent, prog; INSERT INTO DERIVEDFROM VALUES(prog,curent); return new; END; $fillDerivedFromgenby$ LANGUAGE plpgsql; CREATE TRIGGER fillDerivedFromgenby AFTER INSERT ON GENERATEDBY FOR EACH ROW EXECUTE PROCEDURE process_fillDerivedFromGenby();