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 10000 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