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

Responder a