2011/4/6 Luiz Matsumura <[email protected]> > 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 <[email protected]> > 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 >
Obrigado Luiz, tentarei a abordagem sugerida. Eloi
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
