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

Responder a