Re: [pgbr-geral] função: como criar series sem que se multipliquem

2011-04-08 Por tôpico Eloi Ribeiro
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

2011-04-06 Por tôpico Luiz Matsumura
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

2011-04-05 Por tôpico Eloi Ribeiro
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