Re: [pgbr-geral] função: como criar series sem que se multipliquem
2011/4/6 Luiz Matsumura luiz.matsum...@gmail.com Já que está usando pl/pgsql por que não fazer um loop FOR ? algo como FOR i IN 1..100 LOOP INSERT INTO sch_ambiente.escv_incendios_puntos_muestreo( poi_code, fir_code, fir_name, geom) VALUES ( i , new.fir_code , new.fir_name , (select ) ); END LOOP; Em 5 de abril de 2011 05:40, Eloi Ribeiro eloi.ribe...@gmail.com escreveu: Ola à lista, Tenho o seguinte disparador para quando faço um INSERT de um novo registo (polígono incêndio florestal) me crie 100 pontos regulares noutra tabela. A dificuldade que encontro é em numerar esses pontos de 1 a 100, porque cada vez que tento meter um generate_series(1,100) multiplica-me os 100 pontos pela serie (de 1 a 100) e fico com 1 pontos. Entendo que esse seja o resultado lógico, embora não o desejado. Alguém tem uma sugestão para que isto não ocorra? --DROP TRIGGER trg_escv_incendios_todos_subtablas ON sch_ambiente.escv_incendios_todos; --DROP FUNCTION sch_ambiente.trg_escv_incendios_todos_subtablas(); CREATE OR REPLACE FUNCTION sch_ambiente.trg_escv_incendios_todos_subtablas() RETURNS trigger AS $BODY$ BEGIN IF (TG_OP = 'DELETE') THEN DELETE FROM sch_ambiente.escv_incendios_puntos_muestreo WHERE fir_code = OLD.fir_code; ELSIF (TG_OP = 'UPDATE') OR (TG_OP = 'INSERT') THEN -- elimina anteriores para evitar repetidos DELETE FROM sch_ambiente.escv_incendios_puntos_muestreo WHERE fir_code = NEW.fir_code; -- Puntos de muestreo INSERT INTO sch_ambiente.escv_incendios_puntos_muestreo( -- poi_code - CAMPO SERIE DE 1 A 100 fir_code, fir_name, geom) (SELECT -- generate_series(1,100) - SERIE DE 1 A 100 NEW.fir_code, NEW.fir_name, t1.geom FROM (SELECT tx.fir_code, ST_Setsrid(ST_MakePoint(tx.x, ty.y), 23030) AS geom FROM (SELECT NEW.fir_code AS fir_code, generate_series( (SELECT cast(ST_XMin(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)+((SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)/2), (SELECT cast(ST_XMax(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code), (SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)) AS x) AS tx JOIN (SELECT NEW.fir_code AS fir_code, generate_series( (SELECT cast(ST_YMin(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)+((SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)/2), (SELECT cast(ST_YMax(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code), (SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)) AS y) AS ty ON tx.fir_code = ty.fir_code) AS t1, sch_ambiente.escv_incendios_todos AS t2 WHERE t2.fir_code = NEW.fir_code AND (t1.geom t2.geom_23030) AND ST_Intersects(t1.geom, t2.geom_23030)) LIMIT 100; END IF; RETURN NULL; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER trg_escv_incendios_todos_subtablas AFTER INSERT OR UPDATE OR DELETE ON sch_ambiente.escv_incendios_todos FOR EACH ROW EXECUTE PROCEDURE sch_ambiente.trg_escv_incendios_todos_subtablas(); Obrigado, Eloi Ribeiro Obrigado Luiz, tentarei a abordagem sugerida. Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] função: como criar series sem que se multipliquem
Já que está usando pl/pgsql por que não fazer um loop FOR ? algo como FOR i IN 1..100 LOOP INSERT INTO sch_ambiente.escv_incendios_puntos_muestreo( poi_code, fir_code, fir_name, geom) VALUES ( i , new.fir_code , new.fir_name , (select ) ); END LOOP; Em 5 de abril de 2011 05:40, Eloi Ribeiro eloi.ribe...@gmail.com escreveu: Ola à lista, Tenho o seguinte disparador para quando faço um INSERT de um novo registo (polígono incêndio florestal) me crie 100 pontos regulares noutra tabela. A dificuldade que encontro é em numerar esses pontos de 1 a 100, porque cada vez que tento meter um generate_series(1,100) multiplica-me os 100 pontos pela serie (de 1 a 100) e fico com 1 pontos. Entendo que esse seja o resultado lógico, embora não o desejado. Alguém tem uma sugestão para que isto não ocorra? --DROP TRIGGER trg_escv_incendios_todos_subtablas ON sch_ambiente.escv_incendios_todos; --DROP FUNCTION sch_ambiente.trg_escv_incendios_todos_subtablas(); CREATE OR REPLACE FUNCTION sch_ambiente.trg_escv_incendios_todos_subtablas() RETURNS trigger AS $BODY$ BEGIN IF (TG_OP = 'DELETE') THEN DELETE FROM sch_ambiente.escv_incendios_puntos_muestreo WHERE fir_code = OLD.fir_code; ELSIF (TG_OP = 'UPDATE') OR (TG_OP = 'INSERT') THEN -- elimina anteriores para evitar repetidos DELETE FROM sch_ambiente.escv_incendios_puntos_muestreo WHERE fir_code = NEW.fir_code; -- Puntos de muestreo INSERT INTO sch_ambiente.escv_incendios_puntos_muestreo( -- poi_code - CAMPO SERIE DE 1 A 100 fir_code, fir_name, geom) (SELECT -- generate_series(1,100) - SERIE DE 1 A 100 NEW.fir_code, NEW.fir_name, t1.geom FROM (SELECT tx.fir_code, ST_Setsrid(ST_MakePoint(tx.x, ty.y), 23030) AS geom FROM (SELECT NEW.fir_code AS fir_code, generate_series( (SELECT cast(ST_XMin(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)+((SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)/2), (SELECT cast(ST_XMax(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code), (SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)) AS x) AS tx JOIN (SELECT NEW.fir_code AS fir_code, generate_series( (SELECT cast(ST_YMin(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)+((SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)/2), (SELECT cast(ST_YMax(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code), (SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)) AS y) AS ty ON tx.fir_code = ty.fir_code) AS t1, sch_ambiente.escv_incendios_todos AS t2 WHERE t2.fir_code = NEW.fir_code AND (t1.geom t2.geom_23030) AND ST_Intersects(t1.geom, t2.geom_23030)) LIMIT 100; END IF; RETURN NULL; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER trg_escv_incendios_todos_subtablas AFTER INSERT OR UPDATE OR DELETE ON sch_ambiente.escv_incendios_todos FOR EACH ROW EXECUTE PROCEDURE sch_ambiente.trg_escv_incendios_todos_subtablas(); Obrigado, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] função: como criar series sem que se multipliquem
Ola à lista, Tenho o seguinte disparador para quando faço um INSERT de um novo registo (polígono incêndio florestal) me crie 100 pontos regulares noutra tabela. A dificuldade que encontro é em numerar esses pontos de 1 a 100, porque cada vez que tento meter um generate_series(1,100) multiplica-me os 100 pontos pela serie (de 1 a 100) e fico com 1 pontos. Entendo que esse seja o resultado lógico, embora não o desejado. Alguém tem uma sugestão para que isto não ocorra? --DROP TRIGGER trg_escv_incendios_todos_subtablas ON sch_ambiente.escv_incendios_todos; --DROP FUNCTION sch_ambiente.trg_escv_incendios_todos_subtablas(); CREATE OR REPLACE FUNCTION sch_ambiente.trg_escv_incendios_todos_subtablas() RETURNS trigger AS $BODY$ BEGIN IF (TG_OP = 'DELETE') THEN DELETE FROM sch_ambiente.escv_incendios_puntos_muestreo WHERE fir_code = OLD.fir_code; ELSIF (TG_OP = 'UPDATE') OR (TG_OP = 'INSERT') THEN -- elimina anteriores para evitar repetidos DELETE FROM sch_ambiente.escv_incendios_puntos_muestreo WHERE fir_code = NEW.fir_code; -- Puntos de muestreo INSERT INTO sch_ambiente.escv_incendios_puntos_muestreo( -- poi_code - CAMPO SERIE DE 1 A 100 fir_code, fir_name, geom) (SELECT -- generate_series(1,100) - SERIE DE 1 A 100 NEW.fir_code, NEW.fir_name, t1.geom FROM (SELECT tx.fir_code, ST_Setsrid(ST_MakePoint(tx.x, ty.y), 23030) AS geom FROM (SELECT NEW.fir_code AS fir_code, generate_series( (SELECT cast(ST_XMin(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)+((SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)/2), (SELECT cast(ST_XMax(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code), (SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)) AS x) AS tx JOIN (SELECT NEW.fir_code AS fir_code, generate_series( (SELECT cast(ST_YMin(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)+((SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)/2), (SELECT cast(ST_YMax(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code), (SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)) AS y) AS ty ON tx.fir_code = ty.fir_code) AS t1, sch_ambiente.escv_incendios_todos AS t2 WHERE t2.fir_code = NEW.fir_code AND (t1.geom t2.geom_23030) AND ST_Intersects(t1.geom, t2.geom_23030)) LIMIT 100; END IF; RETURN NULL; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER trg_escv_incendios_todos_subtablas AFTER INSERT OR UPDATE OR DELETE ON sch_ambiente.escv_incendios_todos FOR EACH ROW EXECUTE PROCEDURE sch_ambiente.trg_escv_incendios_todos_subtablas(); Obrigado, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral