Re: [pgbr-geral] PostgreSQL 9.1 e 9.3 na mesma maquina, remover 9.1

2015-10-20 Por tôpico Eloi

On 2015-10-20 12:03, Thiago H. Barreto wrote:

Para verificar qual a porta do servidor, terá que entrar na pasta onde 
esta instalado o cluster do postgresql e abrir o arquivo 
"postgresql.conf", dentro do mesmo contem uma linha "port = 5432".


Okay, obrigado Thiago!


2015-10-20 5:55 GMT-02:00 Eloi <e...@openmailbox.org>:
Eu entendo que se tem dois clusters funcionando na mesma maquina estes 
funcionam em diferentes portos, certo?
Provavelmente a primeira instalação (9.1) estará ocupando o porto 5432 
e a 9.3 outro, não sei qual (talvez 5431, 5433???). Como posso 
averiguar isso?
Quando desinstalar a versão 9.1 como se pode mudar o porto da 9.3 para 
5432?


Vejo também que com o comando 'pg_lsclusters' posso ver que clusters 
tenho a rodando na maquina e em que porto.


Saudações,

--
Eloi Ribeiro
Geoinformatic
51.9871, 5.6661
http://eloiribeiro.eu


Links:
--
[1] http://eloiribeiro.eu
[2] 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] PostgreSQL 9.1 e 9.3 na mesma maquina, remover 9.1

2015-10-20 Por tôpico Eloi

Ola a todos na lista,

Um colega escreveu-me com o seguinte problema:

Tem dois clusters funcionando na mesma maquina, PostgreSQL 9.1 e 
PostgreSQL 9.3.

Quer remover a versão 9.1.
Com o PgAdmin só se consegue ligar a versão 9.1 (especulo que só tenha 
tentado pelo porto por defeito, 5432).


Eu entendo que se tem dois clusters funcionando na mesma maquina estes 
funcionam em diferentes portos, certo?
Provavelmente a primeira instalação (9.1) estará ocupando o porto 5432 e 
a 9.3 outro, não sei qual (talvez 5431, 5433???). Como posso averiguar 
isso?
Quando desinstalar a versão 9.1 como se pode mudar o porto da 9.3 para 
5432?


Muito obrigado!

Comprimentos,

Eloi

--
Eloi Ribeiro
Geoinformatic
51.9871, 5.6661
http://eloiribeiro.eu
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

[pgbr-geral] ajuda com SELECT

2015-10-01 Por tôpico Eloi

Boa tarde a todos na lista,

Gostaria de pedir ajuda para resolver a seguinte questão.

Tenho os seguintes dados:
45101;"A";4
45101;"S";23
45102;"A";4
45103;"S";23
45104;"A";4
45105;"S";23
45105;"W";3
45106;"S";23
45107;"A";4
45108;"W";3
45108;"A";4

Na primeira coluna esta um valor que se repete.
Na segunda coluna letras W, A e S, mas que podem ser outras.
Na terceira coluna o 'peso' correspondente a cada uma das letras. Cada 
letra tem sempre o mesmo peso.


Quero uma elaborar uma consulta onde:
1) o valor da primeira coluna não se repete
2) a letra da segunda coluna é a de menor peso
3) não se exclui os registos quando os valores da primeira coluna que 
não se repetem.


Resultado esperado:
45101;"A";4
45102;"A";4
45103;"S";23
45104;"A";4
45105;"W";3
45106;"S";23
45107;"A";4
45108;"W";3

Obrigado! Atentamente,

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] RES: ajuda com SELECT

2015-10-01 Por tôpico Eloi

On 2015-10-01 18:01, Ricardo - Engsolutions wrote:

create temp table teste(chave int, letra char(1), valor int);

insert into teste(chave, letra, valor)
values  (45101,'A',4),
(45101,'S',23),
(45102,'A',4),
(45103,'S',23),
(45104,'A',4),
(45105,'S',23),
(45105,'W',3),
(45106,'S',23),
(45107,'A',4),
(45108,'W',3),
(45108,'A',4);

selectx.chave,
x.letra,
x.valor
from
(
select   chave,
letra,
valor,
row_number() over(partition by chave order by chave, valor) AS 
classificacao

  from teste
) x
where x.classificacao = 1
order by x.chave;

drop table teste;



Obrigado Ricardo, funciona perfeito!
Vou guardar isto nas minhas notas,
 row_number() over(partition by chave order by chave, valor) AS 
classificacao

Muito bom!
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] Ajuda com função

2015-09-28 Por tôpico Eloi

On 2015-09-28 16:21, Sebastian Webber wrote:

AND t2.country_id = '||$$'$$||country_code||$$'$$


Como você queria representar os dados? quote_ident vai colocar eles
entre aspas duplas. Talvez o bloco todo possa ser reescrito com
quote_literal:


AND t2.country_id = QUOTE_LITERAL(country_code)


Sim é isso, não conhecia QUOTE_LITERAL(), fica muito mais simples. 
Obrigado!

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] Ajuda com função

2015-09-28 Por tôpico Eloi

On 2015-09-25 10:33, Eloi wrote:

1) A função não esta a funcionar devidamente. Suponho que relacionado
com esta parte:
AND t2.country_id = '||$$'$$||quote_ident(country_code)||$$'$$
Algo esta mal que não consigo identificar.


O quote_ident() sobra, julgo que porque se trata de uma string e não de 
um objeto.

Assim já funciona:
AND t2.country_id = '||$$'$$||country_code||$$'$$

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] Query com geolocation

2015-06-10 Por tôpico Eloi

On 2015-06-09 19:23, Fabio Luis Rodrigues wrote:

Retornar todos os endereços 2Km próximo de uma localização.
Ex: Necessito retornar todas as filiais de lojas próxima a 2Km da
casa do cliente.

É possível fazer isso?
Como seria aproximadamente esta query?


Partindo do principio que uma distancia linear 'e suficiente podes usar 
a função ST_DWithin [1] de PostGIS [2].


SELECT f.loja, c.cliente
 FROM filial f INNER JOIN cliente c
   ON ST_DWithin(f.geog, c.geog, 2000); -- devolve todas as filiais que 
estão a menos de 2000 m do cliente


Se ainda não tens a geometria nas tabelas filial e cliente:
- ... ADD COLUMN geom(POINT,'epsg_code')
- ... SET geom = ST_SetSRID( -- indica o sistema de coordenadas do ponto
   ST_MakePoint(x,y) -- cria a geometria do 
ponto de observação
,epsg_code) -- define o código EPSG do 
sistema de coordenadas do ponto


[1] http://postgis.net/2013/08/26/tip_ST_DWithin
[2] http://postgis.net/

Boa sorte.

--
Eloi Ribeiro
Geoinformatic
51.9871, 5.6661
http://eloiribeiro.eu
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] embeber código SQL ou PL/SQL em Latex?

2015-04-29 Por tôpico Eloi

On 2015-04-29 11:10, Eloi wrote:

O que pretendo é o que o Euler mostrou com:

psql -c \d mytable -o /tmp/foo.sql -P format=latex meubd


Mas para varias tabelas que estão num determinado schema:

SELECT relname FROM pg_class c
 INNER JOIN pg_namespace n ON (n.oid = c.relnamespace)
 WHERE relkind = 'r'
 AND nspname = 'myschema'
ORDER BY relname; -- 46 tabelas


E que o código que gere a descrição das tabelas fique e se execute
dentro do próprio documento de latex. E que este uma vez compilado
mostre apenas descrição das varias tabelas (\d mytable) presentes no
schema 'myschema'. Não sei se isso é possível.


Já encontrei a uma maneira para resolver o meu problema.
A solução passou por usar código Python dentro de latex.
Deixo aqui o resultado:


\documentclass{article}
\usepackage{python}
\begin{document}

\begin{python}%
import psycopg2
from subprocess import Popen, PIPE, STDOUT

def get_tables(schema):
'''Get tables from a certain schema'''
table_name_list = []
sql = '''
 SELECT relname FROM pg_class c
  INNER JOIN pg_namespace n ON (n.oid = c.relnamespace)
 WHERE relkind = 'r'
 AND nspname = '%s'
 ORDER BY relname; ''' % schema
cur.execute(sql)
lines = cur.fetchall()
for line in lines:
table_name_list.append(line[0])
return table_name_list

def get_tables_description(schema, table_name_list, dbname):
'''Get tables description'''
tables_descrition = ''
for table_name in table_name_list:
cmd = 'psql -c \d %s.%s -P format=latex %s' % (schema, 
table_name, dbname)
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, 
stderr=STDOUT, close_fds=True)

output = p.stdout.read()
tables_descrition = tables_descrition + output
return tables_descrition

# variables
host = 'myhost'
dbname = 'mydb'
user = 'user'
password = ''
schema = 'myschema'

# open connection to PostgreSQL
conn = psycopg2.connect(host='%s' dbname='%s' user='%s' password='%s' 
% (host, dbname, user, password));

cur = conn.cursor()

# execute functions
table_name_list = get_tables(schema)
tables_descrition = get_tables_description(schema, table_name_list, 
dbname)

print tables_descrition

# close connection to PostgreSQL
conn.close()
\end{python}%

\end{document}


Obrigado pelas dicas, foram fundamentais para chegar a esta solução.

Cumprimentos,

Eloi Ribeiro
Geoinformatic
51.9871, 5.6661
http://eloiribeiro.eu
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] embeber código SQL ou PL/SQL em Latex?

2015-04-29 Por tôpico Eloi

On 2015-04-28 17:10, Euler Taveira wrote:

Se você quiser a saída do psql, ele fornece um modo LaTeX. Veja:

psql -c \d mytable -o /tmp/foo.sql -P format=latex meubd

Nos meu relatórios técnicos eu costumo utiliza o pacote listings
definindo a linguagem SQL (não faz o destaque de toda sintaxe do
postgres mas já quebra um galho, além disso, há possibilidade de
adicionar novas palavras chaves com lstset). Algo como:

\begin{lstlisting}
SELECT nspname || '.' || relname FROM pg_class c
INNER JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE relkind = 'r'
AND nspname  'information_schema'
AND relname !~ '^pg_'
\end{lstlisting}


Obrigado pelas respostas, já me deram varias pistas. E desculpem-me pela 
ambiguidade da minha pergunta.


Eu não quero mostrar código SQL no corpo do documento e que este fique 
com uma sintaxe destacada. Mas de todas as maneiras, obrigado, agora já 
sei como se faz.


O que pretendo é o que o Euler mostrou com:

psql -c \d mytable -o /tmp/foo.sql -P format=latex meubd


Mas para varias tabelas que estão num determinado schema:

SELECT relname FROM pg_class c
 INNER JOIN pg_namespace n ON (n.oid = c.relnamespace)
 WHERE relkind = 'r'
 AND nspname = 'myschema'
ORDER BY relname; -- 46 tabelas


E que o código que gere a descrição das tabelas fique e se execute 
dentro do próprio documento de latex. E que este uma vez compilado 
mostre apenas descrição das varias tabelas (\d mytable) presentes no 
schema 'myschema'. Não sei se isso é possível.


Muito obrigado. Cumprimentos,

Eloi


___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] embeber código SQL ou PL/SQL em Latex?

2015-04-28 Por tôpico Eloi

Ola a todos,

Estou a escrever documentação de uma base de dados em Latex e gostaria 
de, no anexo da documentação, listar todas as tabelas da base de dados 
mais detalhes (como por exemplo: as colunas que contem, ,comentário, 
gatilhos, constraints).


Pergunta: É possível fazer isso embebendo código SQL ou PL/SQL no 
documento Latex? Obrigado.


Cumprimentos,

Eloi

--
Eloi Ribeiro
Geoinformatic
51.9871, 5.6661
http://eloiribeiro.eu
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Upgrade Postgis

2015-04-02 Por tôpico Eloi

On 2015-04-02 16:43, Leandro wrote:

Pessoal, alguem que manja bem de postgis poderia me dar um help ...
efetuei upgrade do meu postgis da versão 1.5 para 2.1 e conforme
instruções do site do postigs efetuei o hard_upgrade da base ...perl
utils/postgis_restore.pl [1] /somepath/olddb.backup | psql -h
localhost -p 5432 -U postgres newdb 2 errors.txt

acontece que me retornou varios erros de funções que não existem...
Como minha base é antiga utilizei tambem o legacy.sql , os erros
dimuinuiram mas ainda sim parece que varias funções não existem ...
a ajuda que preciso é como fazer para não ocorrer esses varios erros
de conversão?


O que eu fiz quando tive de atualizar PostGIS de 1.5 para 2.x, foi:
1. passar a geometria para Well-Known Text (WKT), função ST_AsEWKT()
2. fazer um Dump sem o public schema (todas as minhas tabelas já estavam 
noutro schema)

3. criar uma base de dados com a nova versão de PostGIS
4. fazer o Restore do Dump na nova base
5. recriar a geometria e eliminar o Well-Known Text

Boa sorte.

Cumprimentos,

--
Eloi
___
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 para substituir inteiro por NULL

2014-12-08 Por tôpico Eloi

Olá a tod@s,

Existe uma função para substituir um valor inteiro por NULL? Tentei com 
'replace()' mas não dá.

  replace(smallint, integer, unknown) does not exist
  replace(h.oupsampl,-,NULL)

Obrigado. Cumprimentos,

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 para substituir inteiro por NULL

2014-12-08 Por tôpico Eloi

Existe uma função para substituir um valor inteiro por NULL?



bom dia e o coalesce não resolve?
coalesce(campo, -)


Não resolve mas com essa dica já encontrei o que queria, é a função 
NULLIF(). O oposto de coalesce().


Resolvido. Obrigado!

--
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 para substituir inteiro por NULL

2014-12-08 Por tôpico Eloi

On 2014-12-08 14:31, Eloi wrote:

Existe uma função para substituir um valor inteiro por NULL?



bom dia e o coalesce não resolve?
coalesce(campo, -)


Não resolve mas com essa dica já encontrei o que queria, é a função
NULLIF(). O oposto de coalesce().

Resolvido. Obrigado!


Obrigado pelas respostas entretanto enviadas. Sois muito rápidos :-)

[]'s

Eloi
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] ajuda com consulta

2014-10-27 Por tôpico Eloi Ribeiro

Ola a todos da lista,

Tenho uma tabela com possíveis combinações entre valores, e essas 
combinações repetem-se mas numa ordem distinta. Exemplo:


5;12842
5;62409
5;62410
12842;5
12842;62409
12842;62410
62409;5
62409;12842
62409;62410
62410;5
62410;12842
62410;62409

Como posso fazer uma consulta para selecionar apenas as combinações 
possíveis?


5;12842
5;62409
5;62410

Obrigado. Cumprimentos,

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] ajuda com consulta

2014-10-27 Por tôpico Eloi Ribeiro

Não entendi porque 12842;62409, 12842;62410 e 62410;62409 não entram
no resultado, poderia explicar melhor?



Não entendi o resultado desejado.
Por que, por ex., o par (12842, 62410) não faz parte do resultado?


Vou tentar explicar melhor.

Esta tabela indica-me que:
5=12842
5=62409
5=62410
12842=5
12842=62409
12842=62410
62409=5
62409=12842
62409=62410
62410=5
62410=12842
62410=62409

Então se 5=12842, 5=62409 e 5=62410, já sei que 12842=62409, 12842=62410 
e 62410=62409. Estes três últimos resultados estão a repetir a mesma 
informação.

Esqueci-me de indicar isto no primeiro correio.
Obrigado. Cumprimentos,

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] ajuda com consulta

2014-10-27 Por tôpico Eloi Ribeiro

On 2014-10-27 15:13, Matheus de Oliveira wrote:

Agora está mais claro. Vamos lá, supondo a tabela dados(a int, b
int), se não me enganei em algo, a seguinte consulta trará o
resultado esperado:

WITH elements(a,b) AS (
SELECT DISTINCT least(a, b), greatest(a, b)
FROM dados
)
SELECT e1.* FROM elements e1
WHERE NOT EXISTS(SELECT 1 FROM elements e2 WHERE e1.a = e2.b);

 a |   b
---+---
 5 | 12842
 5 | 62410
 5 | 62409
(3 rows)

Verifique em seus dados se atingem o resultado esperado.


Perfeito! Passei de 82978 resultados para 21407 esperados.

Muito obrigado!

Eloi
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] ERROR: could not write to hash-join temporary file: No space left on device

2014-09-22 Por tôpico Eloi Ribeiro

Ola,

Estou a tentar criar uma vista materializada e tenho sempre a seguinte 
mensagem de erro:
ERROR:  could not write to hash-join temporary file: No space left on 
device


Embora na partição root tenha 10 Gb de espaço livre e na partição /home 
480 Gb livres.

A base de dados está numa tablespace em /home/basedados.
Porque isto acontece quando existe espaço livre e como posso contornar 
ou resolver este problema?


Detalhes do software:
SELECT version();
   version
--
 PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 
4.8.2-19ubuntu1) 4.8.2, 64-bit


Obrigado. Cumprimentos,

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] ERROR: could not write to hash-join temporary file: No space left on device

2014-09-22 Por tôpico Eloi Ribeiro

A base de dados está numa tablespace em /home/basedados.
Acabo de me dar conta que a base de dados esta em TABLESPACE = 
pg_default, poder ser este o motivo.


Eloi Ribeiro
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] ERROR: could not write to hash-join temporary file: No space left on device

2014-09-22 Por tôpico Eloi Ribeiro

A base de dados está numa tablespace em /home/basedados.

Acabo de me dar conta que a base de dados esta em TABLESPACE =
pg_default, poder ser este o motivo.


Resolvido com:
ALTER DATABASE test SET TABLESPACE basedados;

--
Eloi Ribeiro
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] remover ' de um texto

2014-07-16 Por tôpico Eloi
Ola,

Tenho uns quantos registos com o símbolo ' no meio do texto e gostaria
de remove-lo.
Como posso fazer isso? Seria algo como isto mas falta-lhe algo:

SELECT replace(campo, ' CALLOSA D'EN SARRIÁ' , '');

Obrigado,

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] remover ' de um texto

2014-07-16 Por tôpico Eloi
On 16-07-14 20:49, Rodrigo Waters wrote:
 SELECT REPLACE( $$marca d'agua$$, $$'$$, '' )
Obrigado! Não conhecia esse truque.
Eloi
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] ajuda com funcao

2014-06-13 Por tôpico Eloi Ribeiro

Ola a todos os participantes da lista,

Gostaria de fazer uma função que:
 1. verifica-se se um determinado valor já existe numa tabela
 2. se sim, que me devolva o id desse registo
 3. se não, que faca o insert e em seguida devolva o id resultante

Escrevi a seguinte código mas falta-me saber como recuperar o resultado 
do EXECUTE. Alguém me pode ajudar? Obrigado.


CREATE OR REPLACE FUNCTION Attribute.fun_insert_attribute(name text, 
description text, type text)

  RETURNS text AS
$BODY$
DECLARE
attribute_id integer;
n integer;
BEGIN
-- verifica se já existe
 EXECUTE 'SELECT count(*) FROM Attribute.Attribute WHERE Name 
ILIKE '||name||';'

-- se já existe, conhecer o id
IF n  1 THEN
 EXECUTE 'SELECT AttributeId FROM Attribute.Attribute WHERE 
Name ILIKE '||name||';'

-- se não existe, inserir e conhecer o id
ELSE
 EXECUTE 'INSERT INTO 
Attribute.Attribute(Name,Description,version_type) 
VALUES('||name||','||description||','||type||') RETURNING 
AttributeId;'

END IF;
RETURN attribute_id;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Os melhores cumprimentos,

--
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] ajuda com funcao

2014-06-13 Por tôpico Eloi Ribeiro

On 2014-06-13 12:02, Matheus de Oliveira wrote:

2014-06-13 6:39 GMT-03:00 Eloi Ribeiro e...@openmailbox.org:



Em primeiro lugar, você não precisaria do EXECUTE, basta executar os
comandos SQL diretamente. No seu caso o EXECUTE não é só ruim,
está **errado**, pois não trata corretamente escape e está
suscetível à SQL-injection.


Obrigado, isso era o que me faltava saber.


Agora, se quer recuperar o valor, mas caso não tenha inserir, basta
usar a variável FOUND (ainda não está bom, veja as considerações
abaixo):


Muito melhor a solução que apresentas, poupo um passo.



Agora, essa função apesar de **aparentemente** fazer o que você
quer, ainda tem diversos possíveis problemas:

1. Você busca usando ILIKE (até troquei por lower+LIKE, por ser mais
eficiente), mas o que acontece se retornar mais de um registro?
Poderia acontecer? No caso acima o PG irá pegar um deles
arbitrariamente (na sorte mesmo). Será que você não queria ter
usando igualdade? O campo Name é único (tem chave UNIQUE)?


Tem um UNIQUE, não existem valores repetidos.


2. A função não está tratando concorrência. Imagine o que
acontece se você fizer o SELECT, não retornar nada, mas quando for
fazer um INSERT alguém acabou de um Name que casaria. Se Name for
UNIQUE vai dar um problemão; se não, só vai ser estranho e acho que
você deveria repensar seriamente no seu modelo de dados e suas
operações (me cheira mal, mas tenho pouca informação para
afirmar).


Não deveria passar porque nesta tabela só podem inserir valores muito 
pouca gente. Mas terei cuidado com isso.



3. Por que está usando nomes de tabelas e atributos com aspas duplas?
Não acha que fica horrível de usar assim depois? (esse não é um
problema de fato, só uma prática ruim na minha opinião).


Eu também não gosto nada e da-me muitas dores de cabeça quando tenho de 
escrever código em Python. Pois todo o banco de dados, todos os objetos 
estão em PascalCase, uma loucura. Cada vez que tenho de por uma aspa 
() tenho de pressionar 3 teclas! E não imaginas o que me custou de 
convencer-lhes de que isto não é o mais ótimo. Mas se fosse só isso...


A função ficou assim:

CREATE OR REPLACE FUNCTION Attribute.fun_insert_attribute(name text, 
description text, type text)

  RETURNS text AS
$BODY$
DECLARE
attribute_id integer;
BEGIN
-- verifica se ja existe e devolve o id
SELECT AttributeId INTO attribute_id FROM Attribute.Attribute 
WHERE lower(trim(Name)) LIKE lower(trim(name));

-- se nao existe, inserir e conhecer o id
IF NOT FOUND THEN
 INSERT INTO 
Attribute.Attribute(Name,Description,version_type) 
VALUES(trim(name),trim(description),trim(type)) RETURNING AttributeId 
INTO attribute_id;

END IF;
RETURN attribute_id;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;


--
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] Migração de postgres + solr para postgres + postGIS

2014-03-21 Por tôpico Eloi Ribeiro

On 2014-03-20 22:41, Sidnei Vladisauskis wrote:

Muito Obrigado, era o que estava pensando a única dúvida que fiquei
é no ST_Point_Inside_Circle, o que seria o geometry a_point?


ST_Point_Inside_Circle(geometry a_point, float center_x, float center_y, 
float radius);
geometry a_point - geometria do ponto do qual queres saber se esta 
dentro ou não do circulo

float center_x, float center_y - centro do circulo
float radius - raio do circulo

A função devolve TRUE / FALSE.

http://postgis.net/docs/manual-2.0/ST_Point_Inside_Circle.html

--
Eloi Ribeiro
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Migração de postgres + solr para postgres + postGIS

2014-03-20 Por tôpico Eloi Ribeiro

On 2014-03-19 02:38, Sidnei Vladisauskis wrote:

Mas como faço para começar a utilizar o PostGis em um BD já
existente?


1) Instala PostGIS, recomendo versão = 2.0

2) Criar a extensão no teu banco:
psql -d a_tua_base -c CREATE EXTENSION postgis;

Se num futuro atualizas o PostGIS:
psql -d postgis -c 'ALTER EXTENSION postgis UPDATE TO 2.x.x;'

3) Adicionar campo com geometria:
ALTER TABLE tabela ADD COLUMN geom geometry(POINT, codigo_epsg); -- 
codigo_epsg para WGS48 = 4326


4) Preencher campo:
UPDATE tabela SET coluna = ST_SetSRID(ST_Makepoint(long,lati), 
codigo_epsg);



Eu queria só fazer um select no postgres com a geolocalização do
usuário, um raio específico e trazer todos spots e seus dados
naquele raio.

Como posso fazer isso?


Para isto podes usar a função ST_Point_Inside_Circle(geometry a_point, 
float center_x, float center_y, float radius)

Ou as funcoes
ST_Intersects(ST_Buffer(geom, valor_raio))


Alguém tem um tutorial ou algum exemplo de como faço isso?


Manual de PostGIS:
http://postgis.net/docs/manual-2.1/index.html

--
Eloi Ribeiro
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] duvida com as aspas dentro de aspas ao criar função

2014-01-20 Por tôpico Eloi Ribeiro

Como faço para passar o valor como inteiro?


Realmente, o next_value devia ser passado como inteiro, não literal.
Para resolver isso, basta usar o %s ao invés de %L. Este irá alocar
o valor diretamente, por isso recomendo um CAST no parâmetro (ele já
é inteiro, mas é só para garantir 100% que não haverá erros):

   format('CREATE SEQUENCE %I.%I START %s OWNED BY %I.%I.%I;', 
, row.next_value::int, ...);



OK! Mudando o %L por %s já passa o valor como inteiro e funciona (mesmo 
sem o cast ::int). A função ficou assim.


CREATE OR REPLACE FUNCTION wosis.fun_create_sequence(sch text)
RETURNS text
LANGUAGE plpgsql VOLATILE
AS
$BODY$
DECLARE
row record;
BEGIN
FOR row IN
SELECT table_name, table_name||'_id' AS id_name, 0 AS 
next_value

FROM information_schema.tables
WHERE table_schema = sch
AND  table_type = 'BASE TABLE'
ORDER BY table_name
LOOP
EXECUTE
format(
   'SELECT max(%I)+1 FROM %I.%I;',
   row.id_name,
   sch,
   row.table_name)
   INTO row.next_value;
EXECUTE
format(
   'CREATE SEQUENCE %I.%I START %s OWNED BY 
%I.%I.%I;',

   sch,
   row.table_name||'_'||row.id_name||'_seq',
   row.next_value,
   sch,
   row.table_name,
   row.id_name
  );
   EXECUTE
   format(
  'ALTER TABLE %I.%I ALTER COLUMN %I SET DEFAULT 
nextval(%L);',

  sch,
  row.table_name,
  row.id_name,
  sch || '.' 
||row.table_name||'_'||row.id_name||'_seq'

 );
END LOOP;
RETURN 'Sequences were created';
END;
$BODY$;
ALTER FUNCTION wosis.fun_create_sequence(text) OWNER TO postgres;
COMMENT ON FUNCTION wosis.fun_create_sequence(text) IS 'Create sequences 
in all tables in a given schema';



Muito obrigado pela ajuda!

[]'s

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] duvida com as aspas dentro de aspas ao criar função

2014-01-19 Por tôpico Eloi

 É, parece que você criou uma bagunça com as aspas mesmo... Acho que vai
 ficar mais fácil refazer a função do que ajustar cada problema nela. Já que
 vamos refazer, que tal adicionar algumas dicas de ouro? ;-)


 Bom, primeiro, veja o modelo que criei (não testei, então pode ter algum
 erro que eu não tenha visto):

 CREATE OR REPLACE FUNCTION wosis.fun_create_sequence(sch text)
 RETURNS text
 LANGUAGE plpgsql VOLATILE
 AS
 $BODY$
 DECLARE
 row record;
 BEGIN
 FOR row IN
 SELECT table_name, table_name||'_id' AS id_name, 0 AS next_value
 FROM information_schema.tables
 WHERE table_schema = sch
 AND  table_type = 'BASE TABLE'
 ORDER BY table_name
 LOOP
 EXECUTE
 format('SELECT max(%I)+1 FROM %I.%I', row.id_name, sch,
 row.table_name)
 INTO row.next_value;
 EXECUTE
 format(
 'CREATE SEQUENCE %I.%I START %L OWNED BY %I.%I.%I;',
 sch,
 row.table_name||'_'||row.id_name||'_seq',
row.next_value -- faltava
 sch,
 row.table_name,
 row.id_name
 );
EXECUTE
format(
 'ALTER TABLE %I.%I ALTER COLUMN %I SET DEFAULT
 nextval(%L);', -- AQUI FALTAVA A VIRGULA
 sch,
 row.table_name,
 row.id_name,
 row.table_name||'_'||row.id_name||'_seq'
 );
 END LOOP;
 RETURN 'Sequences were created';
 END;
 $BODY$;

 Agora vejamos... Em primeiro lugar eu não usei uma tabela temporário,
 simplesmente porque não vi sentido, e acho que acabou deixando a função
 mais confusa ainda. Ao invés disso eu apenas naveguei no resultado da
 consulta à view information_schema.tables. Repare também que não usei
 consulta dinâmica (comando EXECUTE) nesta consulta, simplesmente porque não
 é necessário e recomendo evitar o uso de EXECUTE ao máximo.

 Em segundo lugar, precisamos de três comandos, um para fazer um `SELECT
 max` para recuperar o maior valor, outro para criar a sequência e o último
 para alterar o DEFAULT da tabela. Em ambos os casos a função format ajuda
 bastante, e não precisa de tantos quote_ident's, que podem ser confusos.

 Em [1] há um comparativo legal entre format e quote_ident. Veja lá e poste
 dúvidas que sobrarem aqui.

 Por fim, adicionei a cláusula OWNED BY no CREATE SEQUENCE, para deixar
 idêntico ao que o pseudo-tipo SERIAL faz, e é uma boa prática para futuras
 manutenções.

 Só tenho mais um comentário. Esses comandos estão (talvez erroneamente)
 assumindo que toda tabela tem um campo nome da tabela_id, mas talvez
 faça parte do seu modelo, mas eu evitaria isso, a não ser que seja algo
 executado somente numa tarefa administrativa.

 Ufa... Leia com calma, tentei ser o mais claro possível. ^^

 [1]
 http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-QUOTE-LITERAL-EXAMPLE


 Atenciosamente,

Obrigado a todos pelas respostas e desculpar-me por não responder antes.

Gostei das dicas do 'format()', muito parecido ao python e também do
'INTO row.next_value', não conhecia. E sem duvida que conceptualmente a
função ficou muito melhor, não complicou. Parece que terei de rever
todas as minhas funções que estive a escrever na ultima semana.

Sim, todas as tabelas tem o nome da tabela_id, fiz uma função para
que assim fosse. E sim, é apenas uma tarefa administrativa num esquema
com 70 tabelas.

Foi necessário uns retoques minimos, uma virgula que falatva e passar o
valor de row.next_value.

Agora só falta um detalhe, esta a passar o valor de 'next_value' como
texto e salta erro. Tentei o 'cast' (::int) mas parece-me que isso é
apenas para o puro SQL.

ERROR:  syntax error at or near '25476'
LINE 1: ...E SEQUENCE wosis.class_fao_class_fao_id_seq START '25476' OW...
 ^
QUERY:  CREATE SEQUENCE wosis.class_fao_class_fao_id_seq START '25476'
OWNED BY wosis.class_fao.class_fao_id;
CONTEXT:  PL/pgSQL function fun_create_sequence line 19 at EXECUTE
statement

Como faço para passar o valor como inteiro?

Muito obrigado a todos pelas sugestões, correções e explicações.

Eloi



___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] duvida com as aspas dentro de aspas ao criar função

2014-01-17 Por tôpico Eloi Ribeiro

Ola a todos,

Estou a tentar criar uma função que crie sequencias em todas as tabelas 
num determinado esquema e não consigo avançar por causa das aspas dentro 
de aspas, alguém pode dar uma ajuda.


Aqui está o código, e o problema com as aspas esta no primeiro e no 
terceiro EXECUTE:


CREATE OR REPLACE FUNCTION wosis.fun_create_sequence(sch text)
  RETURNS text AS
$BODY$
DECLARE
row record;
BEGIN
EXECUTE '  CREATE TEMP TABLE tmp AS
   SELECT table_name, table_name||_id' AS id_name, 0 AS 
next_value

   FROM information_schema.tables
   WHERE table_schema = sch
   AND  table_type = 'BASE TABLE'
   ORDER BY table_name;';
FOR row IN
 SELECT table_name, id_name FROM tmp ORDER BY table_name
LOOP
EXECUTE 'UPDATE tmp SET next_value = (SELECT max(' || 
quote_ident(row.id_name) || ')+1 FROM ' || quote_ident(sch) || '.' || 
quote_ident(row.table_name) || ') WHERE table_name = ' || 
quote_ident(row.table_name) || ';'

END LOOP;
FOR row IN
 SELECT table_name, id_name, next_value FROM tmp ORDER BY table_name
LOOP
EXECUTE 'CREATE SEQUENCE ' || quote_ident(row.table_name) || '_' 
|| quote_ident(row.id_name) || '_seq START ' || 
quote_ident(row.next_value) || ';'
EXECUTE 'ALTER TABLE ' || quote_ident(sch) || '.' || 
quote_ident(row.table_name) || ' ALTER COLUMN ' || 
quote_ident(row.id_name) || ' SET DEFAULT nextval( ' || 
quote_ident(row.table_name) || '_' || quote_ident(row.id_name) || 
'_seq);'

END LOOP;
RETURN 'Sequences were created';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION wosis.fun_create_sequence(text) OWNER TO postgres;
COMMENT ON FUNCTION wosis.fun_create_sequence(text) IS 'Create sequences 
in all tables from a given schema';


Obrigado,

--
Eloi Ribeiro
GIS Analyst / Programmer
51.9871, 5.6661
flavors.me/eloiribeiro
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] RES: Extensões mais úteis para o PostgreSQL

2014-01-10 Por tôpico Eloi Ribeiro

On 2014-01-09 20:34, Marcelo Costa wrote:


Estou aceitando dicas de extensões para o elefante que vocês

considerem mais

úteis em seu dia a dia.


PostGIS
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] ajuda com função

2013-12-18 Por tôpico Eloi
Ola a toda a lista,

Estou a tentar fazer funcionar a seguinte função para mover todas as
tabelas de um esquema para outro.
Não obtenho nenhum erro mas no entanto nada é movido.
Peculiaridades: o nome do esquema de origem está em PascalCase e o de
destino em minúsculas.

Alguém me pode indicar o que estou a fazer mal?

CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text)
  RETURNS text AS
$BODY$
DECLARE
row record;
BEGIN
FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from
LOOP
EXECUTE 'ALTER TABLE ' || sch_from || '.' ||
quote_ident(row.tablename) || ' SET SCHEMA ' || sch_to || ';';
END LOOP;
RETURN 'Tables were moved';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

ALTER FUNCTION sys_move_tables(text, text) OWNER TO postgres;

SELECT sys_move_tables('OrigEm', 'destino');

Obrigado. Cumprimentos,

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] ajuda com função

2013-12-18 Por tôpico Eloi Ribeiro

On 2013-12-18 15:23, Matheus de Oliveira wrote:

2013/12/18 Eloi e...@openmailbox.org


Ola a toda a lista,

Estou a tentar fazer funcionar a seguinte função para mover todas
as
tabelas de um esquema para outro.
Não obtenho nenhum erro mas no entanto nada é movido.
Peculiaridades: o nome do esquema de origem está em PascalCase e
o de
destino em minúsculas.

Alguém me pode indicar o que estou a fazer mal?

CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to
text)
  RETURNS text AS
$BODY$
DECLARE
    row record;
BEGIN
    FOR row IN SELECT tablename FROM pg_tables WHERE schemaname =
sch_from
    LOOP
        EXECUTE 'ALTER TABLE ' || sch_from || '.' ||
quote_ident(row.tablename) || ' SET SCHEMA ' || sch_to || ';';
    END LOOP;
RETURN 'Tables were moved';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

ALTER FUNCTION sys_move_tables(text, text) OWNER TO postgres;

SELECT sys_move_tables('OrigEm', 'destino');

Obrigado. Cumprimentos,


Simples. Sua função não executa nada por causa da seguinte
consulta:

    SELECT tablename FROM pg_tables WHERE schemaname = sch_from;

Veja que você passou 'OrigEm' para sch_from, logo essa consulta
ficaria:

    SELECT tablename FROM pg_tables WHERE schemaname = 'OrigEm';

Mas nas tabelas de catálogo, os nomes são armazenados diretamente,
sem aspas duplas, logo sua consulta não traz nenhum registros e o
loop não é executado.

A solução é não passar com aspas duplas na chamada da função e
tratar dentro da mesma:

    CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text,
sch_to text)
  RETURNS text AS
    $BODY$
    DECLARE
    row record;
    BEGIN
     FOR row IN SELECT tablename FROM pg_tables WHERE
schemaname = sch_from
    LOOP
    EXECUTE 'ALTER TABLE ' || quote_ident(sch_from)
|| '.' ||
    quote_ident(row.tablename) || ' SET SCHEMA ' ||
quote_ident(sch_to) || ';';
     END LOOP;
    RETURN 'Tables were moved';
    END;
    $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
   
    SELECT sys_move_tables('OrigEm', 'destino');

Atenciosamente,

--
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres [1]



Certo, já funciona.
Obrigado pela ajuda!

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] ajuda com função

2013-12-18 Por tôpico Eloi
On 18-12-13 18:51, Guimarães Faria Corcete DUTRA, Leandro wrote:
 2013/12/18 Eloi Ribeiro e...@openmailbox.org:
 On 2013-12-18 15:23, Matheus de Oliveira wrote:
 www.dextra.com.br/postgres [1]
 Certo, já funciona.
 Sim, a Dextra funciona, e o PostgreSQL também.

 Brincadeirinha… mas como você não cortou nem sequer a assinatura da
 mensagem a que respondeu, foi como o gMail me mostrou tua resposta.

 Além de evitar o /top posting/, outro ponto da netiqueta — não lembro
 se chega a estar na RFC 1855 — é cortar da mensagem respondida tudo a
 que não se está respondendo diretamente, a menos que seja importante
 para contextualizar.  E evita esses efeitos colaterais engraçados.

Estava eu a pensar por onde cortar quando respondi mas não sabia por
onde e decidi não cortar.
Não conhecia esse critério, terei em conta na próxima vez.
Sim, esta na 'RFC 1855' (também ignorava): 'When replying to a message,
include enough original material to be understood but no more.'
Sempre aprender :-)



___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] separar caracteres minúsculos dos maiúsculos

2013-10-12 Por tôpico Eloi Ribeiro

Ola,

Tenho uma coluna de texto com códigos geológicos tipo:
lKv
uMIsn
CASi
K
CAS

Gostaria de separar os caracteres minúsculos dos maiúsculos, obtendo o 
seguinte resultado:

min_prefixo,maiusculos,min_sufixo
l,K,v
u,MI,sn
,CAS,i
,K,
,CAS,

A dificuldade que encontro deve-se a que não existe uma longitude fixa 
para todos os casos.


Cumprimentos,

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] separar caracteres minúsculos dos maiúsculos

2013-10-12 Por tôpico Eloi
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

On 10/12/2013 05:48 PM, Osvaldo Kussama wrote:
 Em 12/10/13, Guimarães Faria Corcete DUTRA, Leandrol...@dutras.org
 escreveu:
 2013/10/12 Eloi Ribeiro e...@openmailbox.org:
 
 Gostaria de separar os caracteres minúsculos dos maiúsculos
 
 Expressões regulares?
 
 
 Na linha proposta pelo Dutra:
 
 SELECT regexp_replace(foo, '(^[a-z]*)([A-Z]*)([a-z]*)', 
 E'\\1,\\2,\\3', 'g') FROM (VALUES ('lKv'), ('uMIsn'), ('CASi'),
 ('K'), ('CAS')) AS bar(foo); regexp_replace  l,K,v 
 u,MI,sn ,CAS,i ,K, ,CAS, (5 rows)
 
 Osvaldo

Até agora só tinha usado o LIKE / ILIKE com %. Fui ver o que era isso
de 'Expressões regulares' e quase termino com dores de cabeça. Muito duro.

Tinha até chegado aqui, depois de algum tempo de testes:
SELECT substring('lbcCASsvn', '^([a-z]{1,5})'); -- lbc
SELECT substring('lbcCASsvn', 'Y*([A-Z]{1,5})'); -- CAS
SELECT substring('lbcCASsvn', 'A*([a-z]{1,5})$'); -- svn

Mas a solução do Osvaldo é muito mais elegante.

Dutra muito obrigado pela acertada dica. E Osvaldo pela precisa solução.

Cumprimentos,

Eloi


-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQEcBAEBAgAGBQJSWYqeAAoJEP9qulIE6g+y1bMH/jv6NxggjUMcB2DUbSWt3l1Q
FbIEErwV0ofmlsHqcpx4ukGO62hyWZ+8xVaeceAnXXfnms5orCqnNWT2oahRaN+n
7Zcqt0sZzgzpU+ghkBRLm8LP4EhNEp+agE1/l1H7NukdhRGFO/peao0rkhXJ9CIK
b4FZmChGI/+V0aa1Al5pKN/q0eb2xHa5i4PTXvugO6gxws0iUEdWFn1Ex4hjFeEt
gMxd8eEMg0EAu2smWCFBU08FdUPkTqHVldoaQydAJHAsgJSSyRptPvEaIRwkpvwV
Ox0lrirfQnd71r/KgcOK0rUAjo6gCsDmvdUXpmTXl29FtdUszNOi5yz4SUFi4QE=
=o7c9
-END PGP SIGNATURE-
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] armazenamento de rasters

2013-10-08 Por tôpico Eloi
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

On 10/04/2013 08:23 PM, Guimarães Faria Corcete DUTRA, Leandro wrote:
 2013/10/4 mario henrique mario.geotecnol...@gmail.com:
 Olá Pessoal, não encontrei nas listas nada sobre o armazenamento
 de imagens georreferenciadas.
 
 Hm, realmente o ideal é começar pela documentação.  Nas listas
 tende a haver mais respostas a dúvidas específicas.
 
 Já olhaste a documentação do PostGIS?
 

Neste blog poderás encontrar exemplos de grande utilidade sobre esse
tema. http://duncanjg.wordpress.com/category/postgis/

Boa sorte,

Eloi
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQEcBAEBAgAGBQJSU8SZAAoJEP9qulIE6g+yrGEH/i3Dz69AqsBMc4cjN9X4zUGV
4Pt7HN6UBEGTY1TdCno7BnQiml2vxgjFOHg8Lux7bBNbc4Og8Mx7yf7KTKmV+kvI
8ZuwnXoucqbxG6H/J3SH7YTGTWeKftbW1+E/bhK1hV7Bm7xvxZCAgBbsPo/zuRBH
5mwzpDXNlghiLmleGOel6PKCl2OnhcF8SJMvkF9OHa7qfW/ogH1fsPO0dWsgr/VV
Rp1l+SBqs/ERKeQBHkgbu0BMby3h33+pCMZxiRHCui1U+xe8zNxn3hAb+fWYz+HH
2/egYnSaP2/wf/Je6sxaiIo2Hv1R/vRxKtwNggS0/+zleZhc9MJXF5JkVCxAX44=
=V00e
-END PGP SIGNATURE-
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Consulta com 'NOT IN' devolve resultado não esperado

2013-01-10 Por tôpico Eloi Ribeiro
Ola a todos,

Tenha duas tabelas com estações meteorológicas e quero saber quais são 
as estações que estão numa tabela (tmp_estaciones) mas não na outra 
(es_estaciones). Para tal executo a seguinte consulta:

SELECT indicativo
FROM sch_meteo.tmp_estaciones
WHERE indicativo NOT IN (
 SELECT codigo
 FROM sch_meteo.es_estaciones);
-- 0 rows retrieved.

De antemão eu sei que há estações em 'tmp_estaciones' que não estão em 
'es_estaciones'. Assim que o resultado não deveria ser zero linhas. As 
seguintes consultas comprovam isso mesmo:

SELECT indicativo
FROM sch_meteo.tmp_estaciones
WHERE indicativo = 'C917E'; -- 1 row retrieved.

SELECT codigo
FROM sch_meteo.es_estaciones
WHERE codigo = 'C917E'; -- 0 rows retrieved.

O quê que estou a fazer mal?

Obrigado. Cumprimentos,

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] Consulta com 'NOT IN' devolve resultado não esperado

2013-01-10 Por tôpico Eloi Ribeiro

Seria mais interessante você utilizar a combinação de consultas,
no seu caso eu usaria o EXCEPT [1], resumindo seria:

SELECT
   indicativo
FROM
sch_meteo.tmp_estacione
EXCEPT
SELECT
codigo
FROM
sch_meteo.es_estaciones;



Nao conecia o EXCEPT nem o comportamento padrão do NOT IN, estava a 
fazer uma interpretação literal. Com esta lista estamos sempre a 
aprender. Obrigado!


Agora funciona na perfeição:

SELECT indicativo
FROM sch_meteo.tmp_estaciones
EXCEPT
SELECT codigo
FROM sch_meteo.es_estaciones; -- 17 rows retrieved.

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] PostGis

2012-12-13 Por tôpico Eloi Ribeiro

 Importing with configuration: municipios, public, geom, 
 C:\Users\Jonnathann\Desktop\Shapefiles\Municipios, mode=c, dump=1, 
 simple=0, geography=0, index=1, shape=1, srid=0
 Unable to convert field name to UTF-8 (iconv reports Invalid 
 argument). Current encoding is UTF-8. Try LATIN1 (Western 
 European), or one of the values described at 
 http://www.gnu.org/software/libiconv/.
 Shapefile import failed.

Se estas a usar shp2pgsql utiliza o parâmetro '-W' para indicar a 
codificação do shapefile. Se tens o shapefile en latin1, deveria ser '-W 
iso-8859-1'.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] PostGis

2012-12-13 Por tôpico Eloi Ribeiro
 como assim amigo usar o parametro -W? onde usar? É que eu sou novo no 
 postgis, poderia me explicar melhor?
Não indicaste que método usas para subir os shapes a PostgreSQL. 
Assumindo que usas o shp2pgsql, seria assim:

shp2pgsql -s 4326 -g geom -D -I -W iso-8859-1 
C:\Users\Jonnathann\Desktop\Shapefiles\Municipios.shp tb_municipios 
bd_nome | psql -d bd_nome

Parametros shp2pgsql:
   -s srid  Set the SRID field. Defaults to -1.
   (-d|a|c|p) These are mutually exclusive options:
   -d  Drops the table, then recreates it and populates it 
with current shape file data.
   -a  Appends shape file into current table, must be 
exactly the same table schema.
   -c  Creates a new table and populates it, this is the 
default if you do not specify any options.
   -p  Prepare mode, only creates the table.
   -g geocolumn Specify the name of the geometry/geography 
column (mostly useful in append mode).
   -D  Use postgresql dump format (defaults to SQL insert statments.
   -G  Use geography type (requires lon/lat data).
   -k  Keep postgresql identifiers case.
   -i  Use int4 type for all integer dbf fields.
   -I  Create a spatial index on the geocolumn.
   -S  Generate simple geometries instead of MULTI geometries.
   -W encoding Specify the character encoding of Shape's 
attribute column. (default : WINDOWS-1252), iso-8859-1 (codificacao 
Latin-1)
   -N policy NULL geometries handling policy (insert*,skip,abort)
   -n  Only import DBF file.

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Saber a dif min entre timestamp's de duas tabelas

2012-07-31 Por tôpico Eloi Ribeiro
Obrigado pela dica Tiago, a consulta funciona muito melhor com essa dica.

Ficou assim:
*SELECT DISTINCT ON (f.ficheiro) *
*   f.ficheiro,*
*   (f.photo_datetimeoriginal - '00:03:22'::interval) - (p.time +
'02:00:00'::interval) AS dif_ts, *
*   ST_X(p.geom) AS x, *
*   ST_Y(p.geom) AS y *
*FROM sch_forestal.fotos AS f, *
*  sch_forestal.gps_track_points AS p*
*WHERE (p.time + '02:00:00'::interval) *
*  BETWEEN (f.photo_datetimeoriginal - '00:03:22'::interval -
'00:00:05'::interval) *
*  AND (f.photo_datetimeoriginal - '00:03:22'::interval +
'00:00:05'::interval)*
*ORDER BY f.ficheiro;*

Agora vejo que testando com diferentes margens de erro obtenho diferentes
resultados.
Nao existe uma maneira de que me devolva a diferença minima existente estre
os dois timestamps?

-- '00:00:*10*'::interval
ficheiro;dif_ts;x;y
2012-07-17-11-13-06.jpg;*00:00:04*;718135.21515306;4380177.22342103
2012-07-17-11-13-15.jpg;*-00:00:02*;717996.344046553;4380255.12938927
2012-07-17-11-22-21.jpg;*-00:00:04*;708842.044380715;4388544.55736434

-- '00:00:*30*'::interval
ficheiro;dif_ts;x;y
2012-07-17-11-13-06.jpg;*-00:00:15*;717947.652491031;4380279.53855042
2012-07-17-11-13-15.jpg;*-00:00:08*;717922.784056217;4380296.11437229
2012-07-17-11-22-21.jpg;*00:00:30*;709698.090967436;4388139.22602785

Obrigado pela ajuda,

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 27 de Julho de 2012 19:20, Tiago Adami adam...@gmail.com escreveu:

 Em 27 de julho de 2012 12:50, Eloi Ribeiro eloi.ribe...@gmail.com
 escreveu:
  A primeira ideia era que fosse um producto cartesiano mas pensando melhor
  poderia utilizar a data(ano-mes-dia) para restringir e acelarar um pouco
 a
  consulta.
 
  Em defenitiva a ideia e encontrar o ponto com o timestamp mais proximo
 para
  cada timestamp de cada foto.

 Olá Eloi,

 Na exatidão da matemática não há uma noção de próximo ou longínquo, as
 grandezas precisam ser definidas. Dito isto, qual seriam os seus
 limites de próximo?

 Acredito que neste caso você queira manter uma margem de erro para
 baixo e para cima para encontrar seus registros.

 Se você definir esta margem, poderá fazer uma consulta de todos os
 pontos que se enquadram nesta proximidade relativa com o predicado -
 usando como exemplo margem de erro de 02:00:00:

 (...)
 p.ponto_ts BETWEEN (f.foto_ts - '02:00:0'::interval) AND (f.foto_ts +
 '02:00:0'::interval)

 * pode ser que o código não funcione, não tenho como testar agora.

 --
 TIAGO J. ADAMI
 http://www.adamiworks.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] Saber a dif min entre timestamp's de duas tabelas

2012-07-27 Por tôpico Eloi Ribeiro
Ola a todos,

Tenho uma tabela com o timestamp de fotos (fotos.foto_ts) e outra com o
timestampe de pontos (pontos.ponto_ts).
E a minha intenção é geo-referenciar estas fotos por aproximação entre os
timestamps, calculando a diferença mínima entre eles.

Executei a seguinte consulta:

*SELECT DISTINCT ON (f.foto)*
*   f.foto, *
*   ST_X(p.geom), *
*   ST_Y(p.geom)*
*FROM fotos AS f, *
*  pontos AS p*
*ORDER BY f.foto, *
* (f.foto_ts - '00:03:22'::interval) - (p.ponto_ts +
'02:00:00'::interval);*


*(f.foto_ts - '00:03:22'::interval)* - ajusta a hora da câmara de fotos.
*(p.ponto_ts + '02:00:00'::interval)* - ajusta o hora do satélite (solar).

O problema é que demora muito (parei quando ia pelos 5 minutos) ou a
consulta está mal elaborada.
Alguma dica?

Obrigado,

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Saber a dif min entre timestamp's de duas tabelas

2012-07-27 Por tôpico Eloi Ribeiro
A primeira ideia era que fosse um producto cartesiano mas pensando melhor
poderia utilizar a data(ano-mes-dia) para restringir e acelarar um pouco a
consulta.

Em defenitiva a ideia e encontrar o ponto com o timestamp mais proximo para
cada timestamp de cada foto.
 No dia 27 de Jul de 2012 14:46, Guimarães Faria Corcete DUTRA, Leandro 
l...@dutras.org escreveu:
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Fwd: [SIG] Database/Programming specialist - Wageningen, Netherlands

2012-04-05 Por tôpico Eloi Ribeiro
-- Forwarded message --
From:
Date: 2012/3/31
Subject: [SIG] Database/Programming specialist - Wageningen, Netherlands
To: s...@listserv.rediris.es


Database/Programming specialist - Wageningen, Netherlands
http://www.peer.eu/opportunities/vacancies/details/?tx_list_pi1%5Buid%5D=118tx_list_pi1%5Bmode%5D=5cHash=93a600cde1bdc0b393eba453b757451c



Normas para el correcto uso del correo electrónico:
http://www.rediris.es/mail/estilo.html

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Trigger não dispara

2012-03-26 Por tôpico Eloi Ribeiro
Olá a todos,

Estou numa maquina com Ubuntu Desktop 10.04, PostgreSQL 8.4 e PostGIS 1.5.
e não consigo fazer com que um trigger me funcione.
Vou tentar reproduzir o erro aqui:

CREATE TABLE t_incendio (gid serial PRIMARY KEY, codigo bigint);
SELECT AddGeometrycolumn
('public','t_incendio','geom',23030,'MULTIPOLYGON',2);

CREATE TABLE t_areaprotegida (gid serial PRIMARY KEY, tipo varchar(10),
nome varchar(10));
SELECT AddGeometrycolumn
('public','t_areaprotegida','geom',23030,'MULTIPOLYGON',2);

CREATE TABLE t_relatorio (id serial PRIMARY KEY, codigo bigint, tipo
varchar(10), nome varchar(10));

CREATE OR REPLACE FUNCTION fun_teste()
  RETURNS trigger AS
$BODY$
BEGIN
IF (TG_OP = 'INSERT') THEN
INSERT INTO t_relatorio(codigo,tipo,nome)
(SELECT i.codigo, a.tipo, a.nome
FROM t_incendio AS i, t_areaprotegida AS a
WHERE (i.geom  a.geom) AND ST_Intersects(i.geom,a.geom)
GROUP BY i.codigo, a.tipo, a.nome
HAVING i.codigo = NEW.codigo);
ELSIF (TG_OP = 'DELETE') THEN
DELETE FROM t_relatorio
WHERE codigo = OLD.codigo;
END IF;
RETURN NEW;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;

CREATE TRIGGER trg_t_incendio BEFORE INSERT OR UPDATE ON t_incendio FOR
EACH ROW EXECUTE PROCEDURE fun_teste();

INSERT INTO t_areaprotegida (tipo, nome, geom)
VALUES ('P. Natural', 'Bosque', ST_GeomFromText('MULTIPOLYGON(((67
435,68 435,68 434,67 434,67
435)))',23030));
SELECT * FROM t_areaprotegida;
1;P. Natural;Bosque;010620F659010...

INSERT INTO t_incendio (codigo, geom)
VALUES (99, ST_GeomFromText('MULTIPOLYGON(((675000 435,685000
435,685000 434,675000 434,675000 435)))',23030));
SELECT * FROM t_incendio;
1;99;010620F6590100010300010...

SELECT * FROM t_relatorio;
Nada!

Esta é a consulta que está na funçao fun_teste():
SELECT i.codigo, a.tipo, a.nome
FROM t_incendio AS i, t_areaprotegida AS a
WHERE (i.geom  a.geom) AND ST_Intersects(i.geom,a.geom)
GROUP BY i.codigo, a.tipo, a.nome;
99;P. Natural;Bosque

O que é que estou a fazer mal?
Obrigado. Cumprimentos,


Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Trigger não dispara

2012-03-26 Por tôpico Eloi Ribeiro
Era isso Danilo, muito obrigado. Resolvido!
Att.

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 26 de Março de 2012 14:30, Danilo Silva
danilo.dsg.go...@gmail.comescreveu:



 Em 26 de março de 2012 07:36, Eloi Ribeiro eloi.ribe...@gmail.comescreveu:

 Olá a todos,

 corte


 CREATE TRIGGER trg_t_incendio BEFORE INSERT OR UPDATE ON t_incendio FOR
 EACH ROW EXECUTE PROCEDURE fun_teste();

 corte


 Creio que o seu erro está em criar a trigger com o BEFORE, no seu caso
 teria que ser AFTER, pois está sendo feito select em uma tabela que não foi
 inserido dados ainda. Altere a trigger para AFTER e veja o resultado.

 Att.
 Danilo


 ___
 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


Re: [pgbr-geral] Trigger não dispara

2012-03-26 Por tôpico Eloi Ribeiro
Era isso, faltava o DELETE no CREATE TRIGGER, pondo assim:

CREATE TRIGGER trg_t_incendio
 AFTER INSERT OR UPDATE OR DELETE
 ON t_incendio
 FOR EACH ROW EXECUTE PROCEDURE fun_teste();

Já dispara nas três acções (INSERT, UPDATE e DELETE).

Adicionei esta parte à função para contemplar um UPDATE:

ELSIF (TG_OP = 'UPDATE') THEN
DELETE FROM t_relatorio
WHERE codigo = OLD.codigo;
INSERT INTO t_relatorio(codigo,tipo,nome)
(SELECT i.codigo, a.tipo, a.nome
FROM t_incendio AS i, t_areaprotegida AS a
WHERE (i.geom  a.geom) AND ST_Intersects(i.geom,a.geom)
GROUP BY i.codigo, a.tipo, a.nome
HAVING i.codigo = NEW.codigo);

Perfeito, obrigado pela vossa grande ajuda!

Att,

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 26 de Março de 2012 17:42, Danilo Silva
danilo.dsg.go...@gmail.comescreveu:

 A sua trigger somente é executa com ocorre insert ou update, do jeito que
 está nunca será executada para delete.

 Crie outra trigger para o evento de delete.

 Att.

 Danilo

 Em 26 de março de 2012 11:00, Eloi Ribeiro eloi.ribe...@gmail.comescreveu:

  No INSERT a função dispara correctamente mas no DELETE já não, alguma
 razão para isso?

 DELETE FROM t_incendio WHERE codigo=99;
 SELECT * FROM t_incendio;
 --nada, ok

 SELECT * FROM t_relatorio;
 1;99;P. Natural;Bosque - o 'trigger' não disparou para eliminar
 o registo?

 Att,


 Eloi Ribeiro
 GIS Analyst
 39,45º -0,40º
 flavors.me/eloiribeiro


___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-20 Por tôpico Eloi Ribeiro
Obrigado a todos pelas vossas dicas.

Fiz isso, retirei a parte de criação de colunas da função e agora não salta
nenhum erro.
No entanto seria de esperar que quando um polígono fosse editado o campo
área fosse actualizado e isso não acontece.

Alguém me sabe dizer o que é que está mal?


CREATE OR REPLACE FUNCTION fun_dimensoes()
  RETURNS trigger AS
$BODY$
DECLARE
tipovarchar(20);
sridinteger;
BEGIN
tipo :=(SELECT type FROM geometry_columns
WHERE f_table_schema = TG_TABLE_SCHEMA
AND f_table_name = TG_TABLE_NAME);
srid :=(SELECT srid FROM geometry_columns
WHERE f_table_schema = TG_TABLE_SCHEMA
AND   f_table_name = TG_TABLE_NAME);
-- ponto
IF (tipo = 'POINT' OR tipo = 'MULTIPOINT') THEN
NEW.x = ST_X(NEW.geom);
NEW.y = ST_Y(NEW.geom);
-- linha
ELSIF (tipo = 'LINESTRING' OR tipo = 'MULTILINESTRING') THEN
IF (srid = 23030 OR srid = 25830) THEN
NEW.longitude = ST_Length(NEW.geom)::bigint;
ELSIF (srid = 4326) THEN
NEW.longitude = ST_Length(Geography(NEW.geom))::bigint;
END IF;
-- poligono
ELSIF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN
IF (srid = 23030 OR srid = 25830) THEN
NEW.area = ST_Area(NEW.geom)::bigint;
NEW.perimetro = ST_Perimeter(NEW.geom)::bigint;
ELSIF (srid = 4326) THEN
NEW.area = ST_Area(Geography(NEW.geom))::bigint;
NEW.perimetro = ST_Length(Geography(NEW.geom))::bigint;
END IF;
END IF;
RETURN NEW;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;

Obrigado,

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 17 de Março de 2012 21:39, Matheus de Oliveira 
matioli.math...@gmail.com escreveu:

 Se você passar a trigger para AFTER ao invés de BEFORE suas chances de não
 ter lock aumentam, mas não desaparecem. Analisando por cima suas
 necessidades, não acredito que a melhor solução seja realmente adicionar
 uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou
 seja, sempre adicione a coluna (talvez junto com a execução do comando
 CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode
 até fazer a verificação e dar um RAISE EXCEPTION caso não exista).

 PS: Caso a trigger seja genérica para várias tabelas, você pode pensar em
 usar herança nessas tabelas para organizar melhor as coisas.

 Atenciosamente,
 --
 Matheus de Oliveira

 Bacharelado em Ciências de Computação
 Laboratório de Computação de Alto Desempenho - 
 LCADhttp://www.lcad.icmc.usp.br/
 Instituto de Ciências Matemáticas e de Computação - 
 ICMChttp://www.icmc.usp.br/
 Universidade de São Paulo - USP http://www.sc.usp.br/





 On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote:

 O melhor será separar esta função em duas:
 A primeira que verifique se os campos existem e se não os criam.
 E a segunda como disparador para que se actualizem com os inserts e
 updates.
 Obrigado pela ajuda!


 Eloi Ribeiro
 GIS Analyst
 39,45º -0,40º
 flavors.me/eloiribeiro


 No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel 
 fha...@gmail.com escreveu:

  Cancelando as demais transações/conexões também resolve seu problema
  *se, e somente se* isto não for um problema no seu cenário.

 Minha experiência com DDL dentro de funções é de resultado sempre
 inesperado.
 Se a função é específica para ser executada em horário controlado,
 geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
 executando funções do que comandos mais complexos ou scripts.
 Já se a função é para ser chamada automaticamente por causa de uma
 necessidade de uma aplicação ou usuário, a chance de lock é
 monstruosa, e é o que está ocorrendo com o colega.

 []s
 Flavio Gurgel
 ___
 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 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


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-20 Por tôpico Eloi Ribeiro
Sim, não está bem assim?

CREATE TRIGGER trg_postfire_study_area_UPDATE_dimensoes
BEFORE INSERT OR UPDATE
ON sch_forestal.postfire_study_area
FOR EACH ROW
EXECUTE PROCEDURE fun_dimensoes();


Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 20 de Março de 2012 15:09, Matheus de Oliveira 
matioli.math...@gmail.com escreveu:

 A trigger é BEFORE? Caso contrário não atualiza mesmo.



 --
 Matheus de Oliveira

 Bacharelado em Ciências de Computação
 Laboratório de Computação de Alto Desempenho - 
 LCADhttp://www.lcad.icmc.usp.br/
 Instituto de Ciências Matemáticas e de Computação - 
 ICMChttp://www.icmc.usp.br/
 Universidade de São Paulo - USP http://www.sc.usp.br/




 On Tue, Mar 20, 2012 at 10:57 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote:

 Obrigado a todos pelas vossas dicas.

 Fiz isso, retirei a parte de criação de colunas da função e agora não
 salta nenhum erro.
 No entanto seria de esperar que quando um polígono fosse editado o campo
 área fosse actualizado e isso não acontece.

 Alguém me sabe dizer o que é que está mal?



 CREATE OR REPLACE FUNCTION fun_dimensoes()
   RETURNS trigger AS
 $BODY$
 DECLARE
 tipovarchar(20);
 sridinteger;
 BEGIN
 tipo :=(SELECT type FROM geometry_columns
 WHERE f_table_schema = TG_TABLE_SCHEMA
 AND f_table_name = TG_TABLE_NAME);
 srid :=(SELECT srid FROM geometry_columns
 WHERE f_table_schema = TG_TABLE_SCHEMA
 AND   f_table_name = TG_TABLE_NAME);
  -- ponto
 IF (tipo = 'POINT' OR tipo = 'MULTIPOINT') THEN
 NEW.x = ST_X(NEW.geom);
 NEW.y = ST_Y(NEW.geom);
 -- linha
 ELSIF (tipo = 'LINESTRING' OR tipo = 'MULTILINESTRING') THEN

 IF (srid = 23030 OR srid = 25830) THEN
 NEW.longitude = ST_Length(NEW.geom)::bigint;

 ELSIF (srid = 4326) THEN
 NEW.longitude = ST_Length(Geography(NEW.geom))::bigint;
 END IF;
 -- poligono
 ELSIF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN

 IF (srid = 23030 OR srid = 25830) THEN
 NEW.area = ST_Area(NEW.geom)::bigint;
 NEW.perimetro = ST_Perimeter(NEW.geom)::bigint;

 ELSIF (srid = 4326) THEN
 NEW.area = ST_Area(Geography(NEW.geom))::bigint;
 NEW.perimetro = ST_Length(Geography(NEW.geom))::bigint;
 END IF;
 END IF;

 RETURN NEW;
 END;
 $BODY$
   LANGUAGE 'plpgsql' VOLATILE
   COST 100;

 Obrigado,


 Eloi Ribeiro
 GIS Analyst
 39,45º -0,40º
 flavors.me/eloiribeiro


 No dia 17 de Março de 2012 21:39, Matheus de Oliveira 
 matioli.math...@gmail.com escreveu:

 Se você passar a trigger para AFTER ao invés de BEFORE suas chances de
 não ter lock aumentam, mas não desaparecem. Analisando por cima suas
 necessidades, não acredito que a melhor solução seja realmente adicionar
 uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou
 seja, sempre adicione a coluna (talvez junto com a execução do comando
 CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode
 até fazer a verificação e dar um RAISE EXCEPTION caso não exista).

 PS: Caso a trigger seja genérica para várias tabelas, você pode pensar
 em usar herança nessas tabelas para organizar melhor as coisas.

 Atenciosamente,
 --
 Matheus de Oliveira

 Bacharelado em Ciências de Computação
 Laboratório de Computação de Alto Desempenho - 
 LCADhttp://www.lcad.icmc.usp.br/
 Instituto de Ciências Matemáticas e de Computação - 
 ICMChttp://www.icmc.usp.br/
 Universidade de São Paulo - USP http://www.sc.usp.br/





 On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro 
 eloi.ribe...@gmail.comwrote:

 O melhor será separar esta função em duas:
 A primeira que verifique se os campos existem e se não os criam.
 E a segunda como disparador para que se actualizem com os inserts e
 updates.
 Obrigado pela ajuda!


 Eloi Ribeiro
 GIS Analyst
 39,45º -0,40º
 flavors.me/eloiribeiro


 No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel 
 fha...@gmail.com escreveu:

  Cancelando as demais transações/conexões também resolve seu problema
  *se, e somente se* isto não for um problema no seu cenário.

 Minha experiência com DDL dentro de funções é de resultado sempre
 inesperado.
 Se a função é específica para ser executada em horário controlado,
 geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
 executando funções do que comandos mais complexos ou scripts.
 Já se a função é para ser chamada automaticamente por causa de uma
 necessidade de uma aplicação ou usuário, a chance de lock é
 monstruosa, e é o que está ocorrendo com o colega.

 []s
 Flavio Gurgel
 ___
 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

Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-16 Por tôpico Eloi Ribeiro
O melhor será separar esta função em duas:
A primeira que verifique se os campos existem e se não os criam.
E a segunda como disparador para que se actualizem com os inserts e updates.
Obrigado pela ajuda!

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel 
fha...@gmail.com escreveu:

  Cancelando as demais transações/conexões também resolve seu problema
  *se, e somente se* isto não for um problema no seu cenário.

 Minha experiência com DDL dentro de funções é de resultado sempre
 inesperado.
 Se a função é específica para ser executada em horário controlado,
 geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
 executando funções do que comandos mais complexos ou scripts.
 Já se a função é para ser chamada automaticamente por causa de uma
 necessidade de uma aplicação ou usuário, a chance de lock é
 monstruosa, e é o que está ocorrendo com o colega.

 []s
 Flavio Gurgel
 ___
 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


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-15 Por tôpico Eloi Ribeiro
Antes de nada obrigada pela vossas respostas.

Efectivamente, Flavio, o esquema tg_table_schema não existe. Só depois
buscando um pouco mais encontrei que tinha de por a sentencia SQL ALTER
TABLE assim:

EXECUTE 'ALTER TABLE ' || quote_ident(esquema) || '.' ||
quote_ident(tabela) || ' ADD COLUMN area bigint';

E de esta maneira já reconhecia o esquema e nome da tabela.

Tiago, com EXECUTE IMMEDIATE da-me um erro de sintasis:

EXECUTE IMMEDIATE 'ALTER TABLE ' || quote_ident(esquema) || '.' ||
quote_ident(tabela) || ' ADD COLUMN area bigint';
ERROR: error de sintaxis en o cerca de «IMMEDIATE»

OK, agora sem o 'IMMEDIATE' a função é criada com êxito mas quando se
executa salta o seguinte erro:

ERROR:  no se puede hacer ALTER TABLE en «postfire_study_area» porque está
siendo usada por consultas activas en esta sesión
CONTEXTO:  sentencia SQL: «ALTER TABLE sch_forestal.postfire_study_
area ADD COLUMN area bigint»

Claro a função dispara quando faço um update ou insert na tabela e tem de
calcular a 'area' e o 'perimetro' para os registos afectados. Mas se estes
campos não existem deveriam ser criados e depois actualizados. O problema
parece ser que não se pode criar os campos tendo a tabela um insert ou
update em curso. Isto é mesmo assim ou existe uma maneira de contornar este
problema?

Obrigado!

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 15 de Março de 2012 00:49, Tiago Adami adam...@gmail.com escreveu:

 Em 12 de março de 2012 07:11, Eloi Ribeiro eloi.ribe...@gmail.com
 escreveu:
  Ola a todos,
 
  Estou a fazer a seguinte função para que me actualize o campo 'area' cada
  vez que exista um INSERT ou UPDATE numa tabela.
  O problema está que o campo 'area' pode não existir e gostava que nesse
 caso
  o campo seja criado e preenchido para todos os registos.
  Como tenho salta-me o erro de que 'Nao existe o esquema
 «tg_table_schema»' e
  não encontro maneira de resolver isso.
  Como faço para adicionar um campo à tabela onde dispara a função e se
  preencha esse campo?

 Se bem entendi, queres adicionar uma coluna à tabela quando ela não
 existir. Já tentou mudar o seu ALTER TABLE explícito por:

 EXECUTE IMMEDIATE 'ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD
 COLUMN area bigint';

 ?

 --
 TIAGO J. ADAMI
 http://www.adamiworks.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] Ajuda com função - adicionar campo dentro de uma função

2012-03-14 Por tôpico Eloi Ribeiro
Ola a todos,

Estou a fazer a seguinte função para que me actualize o campo 'area' cada
vez que exista um INSERT ou UPDATE numa tabela.
O problema está que o campo 'area' pode não existir e gostava que nesse
caso o campo seja criado e preenchido para todos os registos.
Como tenho salta-me o erro de que 'Nao existe o esquema «tg_table_schema»'
e não encontro maneira de resolver isso.
Como faço para adicionar um campo à tabela onde dispara a função e se
preencha esse campo?
Sugestões são bem vindas.
Obrigado de ante-mão.

CREATE OR REPLACE FUNCTION fun_dimensoes()
  RETURNS trigger AS
$BODY$
DECLARE
tipovarchar(20);
sridinteger;
BEGIN
tipo = (SELECT type FROM geometry_columns
WHERE f_table_schema = TG_TABLE_SCHEMA
AND f_table_name = TG_TABLE_NAME);
srid = (SELECT srid FROM geometry_columns
WHERE f_table_schema = TG_TABLE_SCHEMA
AND   f_table_name = TG_TABLE_NAME);

IF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN
IF NOT EXISTS(SELECT column_name FROM information_schema.columns
WHERE table_schema = TG_TABLE_SCHEMA
AND table_name = TG_TABLE_NAME
AND column_name='area') THEN
*ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD COLUMN area
bigint;*
IF (srid = 23030 OR srid = 25830) THEN
*UPDATE TG_TABLE_SCHEMA.TG_TABLE_NAME SET area =
ST_Area(geom)::bigint;*
ELSIF (srid = 4326) THEN
*UPDATE TG_TABLE_SCHEMA.TG_TABLE_NAME SET area =
ST_Area(Geography(geom))::bigint;*
END IF;
ELSE
IF (srid = 23030 OR srid = 25830) THEN
NEW.area = ST_Area(NEW.geom)::bigint;
ELSIF (srid = 4326) THEN
NEW.area = ST_Area(Geography(NEW.geom))::bigint;
END IF;
END IF;
END IF;

RETURN NEW;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;

CREATE TRIGGER trg_postfire_study_area_UPDATE_dimensoes
BEFORE INSERT OR UPDATE
ON sch_forestal.postfire_study_area
FOR EACH ROW
EXECUTE PROCEDURE fun_dimensoes();

Quando edito a geometria salta o seguinte erro:

ERROR:  no existe el esquema «tg_table_schema»
CONTEXTO:  sentencia SQL: «ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD
COLUMN area bigint»


Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-14 Por tôpico Eloi Ribeiro
Bem, já consegui alguns progressos com a função.
No entanto tenho o seguinte erro:

ERROR:  no se puede hacer ALTER TABLE en «postfire_study_area» porque está
siendo usada por consultas activas en esta sesión
CONTEXTO:  sentencia SQL: «ALTER TABLE sch_forestal.postfire_study_area ADD
COLUMN area bigint»

Fiz as seguintes alterações:



 CREATE OR REPLACE FUNCTION fun_dimensoes()
   RETURNS trigger AS
 $BODY$
 DECLARE


esquemavarchar(20);
tabelavarchar(50);


 tipovarchar(20);
 sridinteger;
 BEGIN


esquema := TG_TABLE_SCHEMA;
tabela:= TG_TABLE_NAME;


 tipo := (SELECT type FROM geometry_columns
 WHERE f_table_schema = TG_TABLE_SCHEMA
 AND f_table_name = TG_TABLE_NAME);
 srid := (SELECT srid FROM geometry_columns
 WHERE f_table_schema = TG_TABLE_SCHEMA
 AND   f_table_name = TG_TABLE_NAME);

 IF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN
 IF NOT EXISTS(SELECT column_name FROM information_schema.columns
 WHERE table_schema = TG_TABLE_SCHEMA
 AND table_name = TG_TABLE_NAME
 AND column_name='area') THEN


EXECUTE 'ALTER TABLE ' || quote_ident(esquema) || '.' ||
quote_ident(tabela) || ' ADD COLUMN area bigint';


 IF (srid = 23030 OR srid = 25830) THEN


EXECUTE 'UPDATE ' || quote_ident(esquema) || '.' || quote_ident(tabela) ||
' SET area = ST_Area(geom)::bigint';


 ELSIF (srid = 4326) THEN


EXECUTE 'UPDATE ' || quote_ident(esquema) || '.' || quote_ident(tabela) ||
' SET area = ST_Area(Geography(geom))::bigint';


 END IF;
 ELSE
 IF (srid = 23030 OR srid = 25830) THEN
 NEW.area = ST_Area(NEW.geom)::bigint;
 ELSIF (srid = 4326) THEN
 NEW.area = ST_Area(Geography(NEW.geom))::bigint;
 END IF;
 END IF;
 END IF;

 RETURN NEW;
 END;
 $BODY$
   LANGUAGE 'plpgsql' VOLATILE
   COST 100;

 CREATE TRIGGER trg_postfire_study_area_UPDATE_dimensoes
 BEFORE INSERT OR UPDATE
 ON sch_forestal.postfire_study_area
 FOR EACH ROW
 EXECUTE PROCEDURE fun_dimensoes();

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Limites e performance do Postgres com Postgis

2012-03-07 Por tôpico Eloi Ribeiro
Nestes links estão algumas sugestões de configuração de PostgreSQL para
servir dados espaciais:
http://workshops.opengeo.org/postgis-intro/tuning.html
http://wiki.openstreetmap.org/wiki/Mapnik/PostGIS#Tuning_the_database

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] tabela de pontos com geometria

2011-10-20 Por tôpico Eloi Ribeiro

  Pessoal alguém pode dizer-me como crio uma tabela de pontos no
 postgresql?

 Só olhar na seção de tipos de dados no manual… não tem segredo algum.

 Se quiser usar isso para geoprocessamento, já é indicado olhar o PostGIS.



Tenho uma entrada no meu blog de como fazer isso com PostGIS.
Boa sorte,


Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] [ajuda] localização fisica do banco de dados no ubuntu

2011-09-02 Por tôpico Eloi Ribeiro
No ubuntu 10.04 a o directorio de cluster esta em
/var/lib/postgresql/8.4/main/base

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
http://eloiribeiro.wordpress.com


No dia 3 de Setembro de 2011 00:14, Marco Antônio Sari 
marcoantonios...@gmail.com escreveu:



 1- voce quer saber o diretorio da aplicacao PostgreSQL ou o diretorio do
 CLUSTER ?
 2- Qual o SO ?

 abç

 2011/9/2 rogerio dandrea rolemo...@gmail.com

 Duvida pra lá de basica, mas não encontrei, onde fica o banco de dados no
 ubuntu? procuro pelo nome do banco.db ?

 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




 --
 Marco Antônio Sari

 ___
 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] passar tabelas de um esquema para outro

2011-05-04 Por tôpico Eloi Ribeiro
Olá à lista,

Tive a necessidade de mover umas tabelas (60 aprox.) de um esquema para
outro e fiz da maneira que detalho mais a baixo.

No entanto, sendo um novato nestas andanças, não estou seguro que seja um
procedimento correto e gostaria saber se acarreta algumas implicações
negativas para o desempenho da base de dados.

Estes foram os passos dados:

# dump
/usr/bin/pg_dump --host localhost --port 5432 --username utilizador --format
plain --column-inserts --no-owner --verbose --file /home/user/ficheiro.sql
--schema 'sch_origem' bd_nome

# mudar o nome do esquema de origem pelo de destino
sed 's/sch_origem/sch_destino/g' ficheiro.sqlficheiro2.sql

# subir as tabelas ao novo esquema
psql -h localhost -U utilizador -d bd_nome -f ficheiro2.sql

O que posso dizer é que por agora funciona tudo bem.

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


Re: [pgbr-geral] passar tabelas de um esquema para outro

2011-05-04 Por tôpico Eloi Ribeiro
2011/5/4 Fabrízio de Royes Mello fabriziome...@gmail.com

Se vc realmente deseja *mover* as tabelas vc poderia simplificar da seguinte
 forma:

 psql -h localhost -U utilizador bd_nome -A -t -c select 'ALTER TABLE
 '||quote_ident(table_schema)||'.'||quote_ident(table_name)||' SET SCHEMA
 '||quote_ident('sch_origem')||';' from information_schema.tables where
 table_schema = 'sch_destino'  | psql -h localhost -U utilizador bd_nome

 Assim elimina a necessidade de dump/restore.


 Obs: Da forma como vc apresentou vc está copiando o conteúdo de um schema
 para outro... se nao apagar o sch_origem da base vc terá ao final os dois.


Uahu! Excelente dica Fabrízio. Tomo nota.
Tens razao, fiquei com as dados duplicados, pelo menos até estar seguro que
estaria tudo bem no novo esquema.
Obrigado.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] passar tabelas de um esquema para outro

2011-05-04 Por tôpico Eloi Ribeiro
2011/5/4 Joao Cosme de Oliveira Junior joao.co...@serpro.gov.br

 mas e uma opcao, se vc tiver um schema vendas clientes... ai lascou mas
 se tiver algum padrao tranquilo



OK, neste caso o nome do esquema nao é comum. Tomo nota da advertencia, nao
me tinha dado conta desse perigo.


2011/5/4 Euler Taveira de Oliveira eu...@timbira.com

 A melhor solução é ALTER TABLE foo SET SCHEMA bar. Soluções com sed podem
 fazer alterações indesejadas (comandos, nome de tabelas, nome de colunas e
 dados do cliente).


Basta executar essa sentencia SQL para cada uma das tabelas?

*ALTER TABLE esquema_origem.tabela1 SET SCHEMA esquema_destino;*

Obrigado por todo o aportado!
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] passar tabelas de um esquema para outro

2011-05-04 Por tôpico Eloi Ribeiro
2011/5/4 JotaComm jota.c...@gmail.com
 Sim,
 Porém, assim você para uma única tabela. Eu mostrei nesta thread como fazer 
 para mais de uma tabela ao mesmo tempo.

OK, cool!
___
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-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


[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


[pgbr-geral] duvida com disparador: eliminar registos desactualizados.

2011-03-25 Por tôpico Eloi Ribeiro
Ola a toda a lista,

Tenho uma tabela de *incendios* (com geometria de polígonos) onde se
encontram os perímetros de incêndios florestais.
Outra *admin* (com geometria de polígonos) com as divisões administrativas.
E uma terceira *resumo* (alfanumérica) onde quero que o seguinte disparador
guarde a superfície afectada por incêndio e município.

Até aqui tudo bem, o problema vem quando faça um UPDATE de um
determinado incêndio, alterando a sua geometria/superfície, o disparador
deve eliminar previamente os registos originados pelo INSERT e recalcular
a superfície afectada por incêndio e município. Não sei como eliminar os
registos desactualizados baseando-me no codigo de incendio (fire_code).

-
-- tabela incendios
CREATE TABLE sch_temp.incendios (gid SERIAL PRIMARY KEY, fir_code BIGINT);
SELECT AddGeometrycolumn ('sch_temp','incendios','geom',23030,'POLYGON',2);

-- tabela municipios
CREATE TABLE sch_temp.municipios (adm_code INT, adm_name VARCHAR(50));
SELECT AddGeometrycolumn ('sch_temp','municipios','geom',23030,'POLYGON',2);
INSERT INTO sch_temp.municipios(adm_code,adm_name, geom) VALUES(101,'Muni
a', ST_GeomFromText('SRID=23030;POLYGON((725000 443,73
443,73 4425000,725000 443))'));
INSERT INTO sch_temp.municipios(adm_code,adm_name, geom) VALUES(102,'Muni
b', ST_GeomFromText('SRID=23030;POLYGON((725000 443,73
4425000,725000 4425000,725000 443))'));

-- tabela resumo
CREATE TABLE sch_temp.resumo (id SERIAL PRIMARY KEY, fir_code BIGINT,
adm_code INT, adm_area BIGINT);

-- disparador
CREATE OR REPLACE FUNCTION funcao_incendios() RETURNS trigger AS
$fire_by_admin$
DECLARE
fire BIGINT;
BEGIN
--fire = NEW.fire_code;   -- -- RAIZ DO PROBLEMA
IF (TG_OP = 'DELETE') THEN
DELETE FROM sch_temp.resumo
WHERE fir_code = fire;
ELSIF (TG_OP = 'UPDATE') OR (TG_OP = 'INSERT') THEN
--DELETE FROM sch_temp.resumo
--WHERE fir_code = fire;
INSERT INTO sch_temp.resumo(fir_code, adm_code, adm_area) (
SELECT t2.fir_code, t1.adm_code,
sum(ST_Area(ST_Intersection(t1.geom,t2.geom)))
FROM sch_temp.municipios AS t1, sch_temp.incendios AS t2
WHERE (t1.geom  t2.geom)
AND ST_Intersects(t1.geom,t2.geom)
GROUP BY t2.fir_code, t1.adm_code);
END IF;
RETURN NULL;
END;
$fire_by_admin$ LANGUAGE plpgsql;

CREATE TRIGGER funcao_incendios
AFTER INSERT OR UPDATE OR DELETE ON sch_temp.incendios
FOR EACH ROW EXECUTE PROCEDURE funcao_incendios();

-- insert
INSERT INTO sch_temp.incendios(fir_code, geom) VALUES(1,
ST_GeomFromText('SRID=23030;POLYGON((726000 4429000,729000 4429000,729000
4426000,726000 4426000,726000 4429000))'));
SELECT * FROM sch_temp.resumo;

-- resultado observado e esperado
/*fir_code,adm_code,adm_area
1;1;101;450
2;1;102;450*/

-- update
UPDATE sch_temp.incendios SET geom =
ST_GeomFromText('SRID=23030;POLYGON((727000 4429000,729100 4429000,729100
4427000,727000 4429000))') WHERE gid = 1;
SELECT * FROM sch_temp.resumo;

-- resultado observado
/*fir_code,adm_code,adm_area
1;1;101;450  - este registe devia ser eliminado, vem do INSERT
2;1;102;450  - este registe devia ser eliminado, vem do INSERT
3;1;101;210*/

-- resultado esperado
/*fir_code,adm_code,adm_area
3;1;101;210*/

-- eliminar todo o anterior
/*DROP TRIGGER IF EXISTS funcao_incendios ON sch_temp.incendios;
SELECT DropGeometryColumn('sch_temp','incendios','geom');
SELECT DropGeometryColumn('sch_temp','municipios','geom');
DROP TABLE sch_temp.resumo;
DROP TABLE sch_temp.municipios;
DROP TABLE sch_temp.incendios;*/
-

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


Re: [pgbr-geral] duvida com disparador: eliminar registos desactualizados.

2011-03-25 Por tôpico Eloi Ribeiro
On Fri, Mar 25, 2011 at 13:57, Osvaldo Kussama osvaldo.kuss...@gmail.comwrote:

 2011/3/25, Eloi Ribeiro eloi.ribe...@gmail.com:
  Ola a toda a lista,
 
  Tenho uma tabela de *incendios* (com geometria de polígonos) onde se
  encontram os perímetros de incêndios florestais.
  Outra *admin* (com geometria de polígonos) com as divisões
 administrativas.
  E uma terceira *resumo* (alfanumérica) onde quero que o seguinte
 disparador
  guarde a superfície afectada por incêndio e município.
 
  Até aqui tudo bem, o problema vem quando faça um UPDATE de um
  determinado incêndio, alterando a sua geometria/superfície, o disparador
  deve eliminar previamente os registos originados pelo INSERT e recalcular
  a superfície afectada por incêndio e município. Não sei como eliminar os
  registos desactualizados baseando-me no codigo de incendio (fire_code).
 
  -
  -- tabela incendios
  CREATE TABLE sch_temp.incendios (gid SERIAL PRIMARY KEY, fir_code
 BIGINT);
  SELECT AddGeometrycolumn
 ('sch_temp','incendios','geom',23030,'POLYGON',2);
 
  -- tabela municipios
  CREATE TABLE sch_temp.municipios (adm_code INT, adm_name VARCHAR(50));
  SELECT AddGeometrycolumn
 ('sch_temp','municipios','geom',23030,'POLYGON',2);
  INSERT INTO sch_temp.municipios(adm_code,adm_name, geom) VALUES(101,'Muni
  a', ST_GeomFromText('SRID=23030;POLYGON((725000 443,73
  443,73 4425000,725000 443))'));
  INSERT INTO sch_temp.municipios(adm_code,adm_name, geom) VALUES(102,'Muni
  b', ST_GeomFromText('SRID=23030;POLYGON((725000 443,73
  4425000,725000 4425000,725000 443))'));
 
  -- tabela resumo
  CREATE TABLE sch_temp.resumo (id SERIAL PRIMARY KEY, fir_code BIGINT,
  adm_code INT, adm_area BIGINT);
 
  -- disparador
  CREATE OR REPLACE FUNCTION funcao_incendios() RETURNS trigger AS
  $fire_by_admin$
  DECLARE
  fire BIGINT;
  BEGIN
  --fire = NEW.fire_code;   -- -- RAIZ DO PROBLEMA
  IF (TG_OP = 'DELETE') THEN
  DELETE FROM sch_temp.resumo
  WHERE fir_code = fire;
  ELSIF (TG_OP = 'UPDATE') OR (TG_OP = 'INSERT') THEN
  --DELETE FROM sch_temp.resumo
  --WHERE fir_code = fire;
  INSERT INTO sch_temp.resumo(fir_code, adm_code, adm_area) (
  SELECT t2.fir_code, t1.adm_code,
  sum(ST_Area(ST_Intersection(t1.geom,t2.geom)))
  FROM sch_temp.municipios AS t1, sch_temp.incendios AS t2
  WHERE (t1.geom  t2.geom)
  AND ST_Intersects(t1.geom,t2.geom)
  GROUP BY t2.fir_code, t1.adm_code);
  END IF;
  RETURN NULL;
  END;
  $fire_by_admin$ LANGUAGE plpgsql;
 
  CREATE TRIGGER funcao_incendios
  AFTER INSERT OR UPDATE OR DELETE ON sch_temp.incendios
  FOR EACH ROW EXECUTE PROCEDURE funcao_incendios();
 
  -- insert
  INSERT INTO sch_temp.incendios(fir_code, geom) VALUES(1,
  ST_GeomFromText('SRID=23030;POLYGON((726000 4429000,729000 4429000,729000
  4426000,726000 4426000,726000 4429000))'));
  SELECT * FROM sch_temp.resumo;
 
  -- resultado observado e esperado
  /*fir_code,adm_code,adm_area
  1;1;101;450
  2;1;102;450*/
 
  -- update
  UPDATE sch_temp.incendios SET geom =
  ST_GeomFromText('SRID=23030;POLYGON((727000 4429000,729100 4429000,729100
  4427000,727000 4429000))') WHERE gid = 1;
  SELECT * FROM sch_temp.resumo;
 
  -- resultado observado
  /*fir_code,adm_code,adm_area
  1;1;101;450  - este registe devia ser eliminado, vem do INSERT
  2;1;102;450  - este registe devia ser eliminado, vem do INSERT
  3;1;101;210*/
 
  -- resultado esperado
  /*fir_code,adm_code,adm_area
  3;1;101;210*/
 
  -- eliminar todo o anterior
  /*DROP TRIGGER IF EXISTS funcao_incendios ON sch_temp.incendios;
  SELECT DropGeometryColumn('sch_temp','incendios','geom');
  SELECT DropGeometryColumn('sch_temp','municipios','geom');
  DROP TABLE sch_temp.resumo;
  DROP TABLE sch_temp.municipios;
  DROP TABLE sch_temp.incendios;*/
  -
 


 Não sei se é apenas um erro de digitação mas o campo fire_code em sua
 tabela incendios.
 Talvez deva ser fir_cod.

 Outro detalhe é que no caso da operação DELETE o campo NEW.fir_code
 contém NULL, para sua função ter sentido você precisa se referir a
 OLD.fir_code.

 Osvaldo



Sim estava mal, substitui o *fire_code* por *fir_code*.

Se ponho assim: ERROR: error de sintaxis en o cerca de «SELECT»
*fire = SELECT fir_cod FROM sch_temp.incendios WHERE NEW.geom = OLD.geom;*

Desta maneira da-me: ERROR:  el registro «old» no ha sido asignado aún
*fire = OLD.fir_code;*

Não sei como definir o *fir_code* que devem ser eliminados.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] duvida com disparador: eliminar registos desactualizados.

2011-03-25 Por tôpico Eloi Ribeiro
2011/3/25 Osvaldo Kussama osvaldo.kuss...@gmail.com

 2011/3/25, Eloi Ribeiro eloi.ribe...@gmail.com:
  On Fri, Mar 25, 2011 at 13:57, Osvaldo Kussama
  osvaldo.kuss...@gmail.comwrote:
 
  2011/3/25, Eloi Ribeiro eloi.ribe...@gmail.com:
   Ola a toda a lista,
  
   Tenho uma tabela de *incendios* (com geometria de polígonos) onde se
   encontram os perímetros de incêndios florestais.
   Outra *admin* (com geometria de polígonos) com as divisões
  administrativas.
   E uma terceira *resumo* (alfanumérica) onde quero que o seguinte
  disparador
   guarde a superfície afectada por incêndio e município.
  
   Até aqui tudo bem, o problema vem quando faça um UPDATE de um
   determinado incêndio, alterando a sua geometria/superfície, o
 disparador
   deve eliminar previamente os registos originados pelo INSERT e
   recalcular
   a superfície afectada por incêndio e município. Não sei como eliminar
 os
   registos desactualizados baseando-me no codigo de incendio
 (fire_code).
  
   -
   -- tabela incendios
   CREATE TABLE sch_temp.incendios (gid SERIAL PRIMARY KEY, fir_code
  BIGINT);
   SELECT AddGeometrycolumn
  ('sch_temp','incendios','geom',23030,'POLYGON',2);
  
   -- tabela municipios
   CREATE TABLE sch_temp.municipios (adm_code INT, adm_name VARCHAR(50));
   SELECT AddGeometrycolumn
  ('sch_temp','municipios','geom',23030,'POLYGON',2);
   INSERT INTO sch_temp.municipios(adm_code,adm_name, geom)
   VALUES(101,'Muni
   a', ST_GeomFromText('SRID=23030;POLYGON((725000 443,73
   443,73 4425000,725000 443))'));
   INSERT INTO sch_temp.municipios(adm_code,adm_name, geom)
   VALUES(102,'Muni
   b', ST_GeomFromText('SRID=23030;POLYGON((725000 443,73
   4425000,725000 4425000,725000 443))'));
  
   -- tabela resumo
   CREATE TABLE sch_temp.resumo (id SERIAL PRIMARY KEY, fir_code BIGINT,
   adm_code INT, adm_area BIGINT);
  
   -- disparador
   CREATE OR REPLACE FUNCTION funcao_incendios() RETURNS trigger AS
   $fire_by_admin$
   DECLARE
   fire BIGINT;
   BEGIN
   --fire = NEW.fire_code;   -- -- RAIZ DO PROBLEMA
   IF (TG_OP = 'DELETE') THEN
   DELETE FROM sch_temp.resumo
   WHERE fir_code = fire;
   ELSIF (TG_OP = 'UPDATE') OR (TG_OP = 'INSERT') THEN
   --DELETE FROM sch_temp.resumo
   --WHERE fir_code = fire;
   INSERT INTO sch_temp.resumo(fir_code, adm_code, adm_area) (
   SELECT t2.fir_code, t1.adm_code,
   sum(ST_Area(ST_Intersection(t1.geom,t2.geom)))
   FROM sch_temp.municipios AS t1, sch_temp.incendios AS t2
   WHERE (t1.geom  t2.geom)
   AND ST_Intersects(t1.geom,t2.geom)
   GROUP BY t2.fir_code, t1.adm_code);
   END IF;
   RETURN NULL;
   END;
   $fire_by_admin$ LANGUAGE plpgsql;
  
   CREATE TRIGGER funcao_incendios
   AFTER INSERT OR UPDATE OR DELETE ON sch_temp.incendios
   FOR EACH ROW EXECUTE PROCEDURE funcao_incendios();
  
   -- insert
   INSERT INTO sch_temp.incendios(fir_code, geom) VALUES(1,
   ST_GeomFromText('SRID=23030;POLYGON((726000 4429000,729000
   4429000,729000
   4426000,726000 4426000,726000 4429000))'));
   SELECT * FROM sch_temp.resumo;
  
   -- resultado observado e esperado
   /*fir_code,adm_code,adm_area
   1;1;101;450
   2;1;102;450*/
  
   -- update
   UPDATE sch_temp.incendios SET geom =
   ST_GeomFromText('SRID=23030;POLYGON((727000 4429000,729100
   4429000,729100
   4427000,727000 4429000))') WHERE gid = 1;
   SELECT * FROM sch_temp.resumo;
  
   -- resultado observado
   /*fir_code,adm_code,adm_area
   1;1;101;450  - este registe devia ser eliminado, vem do INSERT
   2;1;102;450  - este registe devia ser eliminado, vem do INSERT
   3;1;101;210*/
  
   -- resultado esperado
   /*fir_code,adm_code,adm_area
   3;1;101;210*/
  
   -- eliminar todo o anterior
   /*DROP TRIGGER IF EXISTS funcao_incendios ON sch_temp.incendios;
   SELECT DropGeometryColumn('sch_temp','incendios','geom');
   SELECT DropGeometryColumn('sch_temp','municipios','geom');
   DROP TABLE sch_temp.resumo;
   DROP TABLE sch_temp.municipios;
   DROP TABLE sch_temp.incendios;*/
   -
  
 
 
  Não sei se é apenas um erro de digitação mas o campo fire_code em sua
  tabela incendios.
  Talvez deva ser fir_cod.
 
  Outro detalhe é que no caso da operação DELETE o campo NEW.fir_code
  contém NULL, para sua função ter sentido você precisa se referir a
  OLD.fir_code.
 
  Osvaldo
 
 
 
  Sim estava mal, substitui o *fire_code* por *fir_code*.
 
  Se ponho assim: ERROR: error de sintaxis en o cerca de «SELECT»
  *fire = SELECT fir_cod FROM sch_temp.incendios WHERE NEW.geom =
 OLD.geom;*
 
  Desta maneira da-me: ERROR:  el registro «old» no ha sido asignado aún
  *fire = OLD.fir_code;*
 
  Não sei como definir o *fir_code* que devem ser eliminados.
 


 Para a atribuição utilize SELECT INTO.

 Para o segundo ponto você precisa utilizar NEW ou OLD dependendo da
 operação (INSERT, UPDATE ou DELETE) sendo realizada.

 Em minha opinião no lugar da variável local

[pgbr-geral] consulta SQL que devolva uma lista com todos os dias de um determinado mês

2011-03-14 Por tôpico Eloi Ribeiro
Ola a toda a lista,

É possível criar uma consulta SQL que devolva uma lista com todos os dias de
um determinado mês?
De momento apenas consegui chegar até aqui, tendo como exemplo o mês de
Fevereiro de 2011:
SELECT
to_date('2011/02', '/MM'),
(date_trunc('MONTH', to_date('2011/02', '/MM')) + INTERVAL '1 MONTH
- 1 day')::date;

O resultado da anterior consulta é o primeiro e ultimo dia do mês:
2011-02-01;2011-02-28

Resultado pretendido é o seguinte:
2011-02-01
2011-02-02
2011-02-03
(...)
2011-02-26
2011-02-27
2011-02-28

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


Re: [pgbr-geral] consulta SQL que devolva uma lista com todos os dias de um determinado mês

2011-03-14 Por tôpico Eloi Ribeiro
2011/3/14 Fabrízio de Royes Mello fabriziome...@gmail.com


 Em 14 de março de 2011 07:13, Eloi Ribeiro eloi.ribe...@gmail.comescreveu:

 Ola a toda a lista,

 É possível criar uma consulta SQL que devolva uma lista com todos os dias
 de um determinado mês?
 De momento apenas consegui chegar até aqui, tendo como exemplo o mês de
 Fevereiro de 2011:
 SELECT
 to_date('2011/02', '/MM'),
 (date_trunc('MONTH', to_date('2011/02', '/MM')) + INTERVAL '1
 MONTH - 1 day')::date;

 O resultado da anterior consulta é o primeiro e ultimo dia do mês:
 2011-02-01;2011-02-28

 Resultado pretendido é o seguinte:
 2011-02-01
 2011-02-02
 2011-02-03
 (...)
 2011-02-26
 2011-02-27
 2011-02-28


 Veja se isso resolve:

 select '2011-02-01'::date + dia
   from generate_series(0, extract( day from (('2011-02-01'::date + '1
 month'::interval)::date - 1::integer))::integer - 1) as dia;


 Cordialmente,

 --
 Fabrízio de Royes Mello
  Blog sobre TI: http://fabriziomello.blogspot.com
  Perfil Linkedin: http://br.linkedin.com/in/fabriziomello


Muito obrigado Fabrízio, solucionado!

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


Re: [pgbr-geral] consulta SQL que devolva uma lista com todos os dias de um determinado mês

2011-03-14 Por tôpico Eloi Ribeiro
2011/3/14 Emerson Hermann emersonherm...@gmail.com

 Se ainda servir ...

  SELECT dia::date
FROM (
   SELECT (to_date('2011-03','-MM')+s.a*'1
 day'::INTERVAL) AS dia
 FROM generate_series(0, (date_trunc('MONTH',
 to_date('2011/03', '/MM')) + INTERVAL '1 MONTH - 1 day')::date -
 to_date('2011/03', '/MM'), 1
  ) AS s(a)) x

 Em 14 de março de 2011 07:36, Fabrízio de Royes Mello
 fabriziome...@gmail.com escreveu:
 
  Em 14 de março de 2011 07:13, Eloi Ribeiro eloi.ribe...@gmail.com
  escreveu:
 
  Ola a toda a lista,
  É possível criar uma consulta SQL que devolva uma lista com todos os
 dias
  de um determinado mês?
  De momento apenas consegui chegar até aqui, tendo como exemplo o mês de
  Fevereiro de 2011:
  SELECT
  to_date('2011/02', '/MM'),
  (date_trunc('MONTH', to_date('2011/02', '/MM')) + INTERVAL '1
  MONTH - 1 day')::date;
  O resultado da anterior consulta é o primeiro e ultimo dia do mês:
  2011-02-01;2011-02-28
  Resultado pretendido é o seguinte:
  2011-02-01
  2011-02-02
  2011-02-03
  (...)
  2011-02-26
  2011-02-27
  2011-02-28
 
  Veja se isso resolve:
  select '2011-02-01'::date + dia
from generate_series(0, extract( day from (('2011-02-01'::date + '1
  month'::interval)::date - 1::integer))::integer - 1) as dia;
 
  Cordialmente,
  --
  Fabrízio de Royes Mello
  Blog sobre TI: http://fabriziomello.blogspot.com
  Perfil Linkedin: http://br.linkedin.com/in/fabriziomello
 
  ___
  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



Assim fica bastante simples:

SELECT * FROM generate_series('2011-02-01'::date,'2011-03-01'::date-1, '1
day');

Obrigado a todos,

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] tratar nulls como zeros

2011-03-08 Por tôpico Eloi Ribeiro
Olá à lista,

Como faço para evitar resultados null de esta seleçao:

SELECT c0-(c1+c2+c3+c4) FROM t1;

c0;c1;c2;c3;c4
07:01:13
06:50:22
07:09:11
07:28:58;00:28:00;;;
11:19:0401:33:00
08:09:24;;;00:27:46;
06:44:13;;03:40:36;;
07:01:47
07:06:07;00:14:00;;;
07:59:49;;;00:30:16;
07:00:38
11:05:59;;;00:35:49;
07:05:39
06:50:45;00:14:00;;;
07:12:36
07:24:36
10:26:16;;;00:32:46;
09:03:10;;;01:50:19;
06:56:40
08:06:59;;;00:24:06;

Gostaria que o resultado de 10:00:00-(01:00:00+null+null+null) = 09:00:00

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


Re: [pgbr-geral] tratar nulls como zeros

2011-03-08 Por tôpico Eloi Ribeiro
Fantastico, era isso mesmo.
Obrigado!

Eloi Ribeiro
GIS Analyst
39,45º -4,40º
http://eloiribeiro.wordpress.com


2011/3/8 Tiago Adami adam...@gmail.com

 Em 8 de março de 2011 12:50, Eloi Ribeiro eloi.ribe...@gmail.com
 escreveu:
  Olá à lista,
  Como faço para evitar resultados null de esta seleçao:
  SELECT c0-(c1+c2+c3+c4) FROM t1;
  c0;c1;c2;c3;c4
  07:01:13
  06:50:22
  07:09:11
  07:28:58;00:28:00;;;
  11:19:0401:33:00
  08:09:24;;;00:27:46;
  06:44:13;;03:40:36;;
  07:01:47
  07:06:07;00:14:00;;;
  07:59:49;;;00:30:16;
  07:00:38
  11:05:59;;;00:35:49;
  07:05:39
  06:50:45;00:14:00;;;
  07:12:36
  07:24:36
  10:26:16;;;00:32:46;
  09:03:10;;;01:50:19;
  06:56:40
  08:06:59;;;00:24:06;
  Gostaria que o resultado de 10:00:00-(01:00:00+null+null+null) = 09:00:00
  Obrigado,
 

 Primeiro você precisa definir qual o valor irá substituir os nulos. Se
 for usar a hora zero ( 00:00:00 ), tente a função COALESCE para cada
 uma das colunas:

 SELECT
 COALESCE(c0,'00:00:00')-(COALESCE(c1,'00:00:00')+COALESCE(c2,'00:00:00')+COALESCE(c3,'00:00:00')+COALESCE(c4,'00:00:00'))
 FROM t1;


 --
 TIAGO J. ADAMI
 http://www.adamiworks.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] consulta de agregaçao (GROUP BY ) e com uma restriçao WHERE?

2010-12-20 Por tôpico Eloi Ribeiro
Ola à lista,

Como posso fazer uma consulta de agregação (GROUP BY) e com uma restrição
tipo WHERE?
Exemplo:

SELECT count(x) FROM tabela WHERE count(x)1 GROUP BY x;

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


Re: [pgbr-geral] consulta de agregaçao (GROUP BY ) e com uma restriçao WHERE?

2010-12-20 Por tôpico Eloi Ribeiro
Ok, assim já funciona.

SELECT count(x) FROM tabela GROUP BY x HAVING count(x)1;

Obrigado Victor!
[]´s

Eloi Ribeiro
GIS Analyst
39,45º -4,40º
http://eloiribeiro.wordpress.com


2010/12/20 Victor Hugo vh.cleme...@gmail.com

 Neste exemplo que vc passou seria melhor vc utilizar having.

 SELECT count(x) FROM tabela HAVING count(x)1 GROUP BY x;

 []´s
 Victor Hugo

 Em 20 de dezembro de 2010 11:36, Eloi Ribeiro 
 eloi.ribe...@gmail.comescreveu:

 Ola à lista,

 Como posso fazer uma consulta de agregação (GROUP BY) e com uma restrição
 tipo WHERE?
 Exemplo:

 SELECT count(x) FROM tabela WHERE count(x)1 GROUP BY x;

 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




 --
 []´s
 Victor Hugo

 ___
 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


Re: [pgbr-geral] ajuda com disparador

2010-11-17 Por tôpico Eloi Ribeiro
4096946.77669013,678073.796964852 4096949.86875352);LINESTRING(-5 37,-1
37)

Cumprimentos,

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


Re: [pgbr-geral] ajuda com disparador

2010-11-16 Por tôpico Eloi Ribeiro
2010/11/16 Osvaldo Kussama osvaldo.kuss...@gmail.com

 Em 15 de novembro de 2010 14:38, Eloi Ribeiro eloi.ribe...@gmail.com
 escreveu:
  Olá à lista,
  Queria fazer um disparador sobre uma tabela com dois campos do
  tipo 'Geometry' (geom_23030 e geom_4258) cada um com um sistema de
  coordenadas diferente.
  A ideia era que o disparador actualiza-se o segundo campo sempre que
  houvesse um INSERT ou UPDATE no primeiro campo e assim tivessem sempre a
  mesma geometria mas cada um dos campos com o seu respectivo sistemas de
  coordenadas.
  Devido à minha falta de experiência em plpgsql eu não sei como fazer para
  que o disparador reconheça qual a geometria mais recente e proceder com
  a actualização da mais antiga. Como tenho feito, actualiza por ordem de
 como
  está indicado no disparador sem ter em conta a antiguidade. Deveria
  adicionar dois novos campos com Time Stamp de cada uma das geometrias
 para
  conseguir o meu objectivo?
  Estou a usar algumas das funções disponibilizadas pela extensão PostGIS.
  Isto foi o que consegui fazer:
  --SELECT DropGeometryColumn('sch_temp','teste','geom_23030');
  --SELECT DropGeometryColumn('sch_temp','teste','geom_4258');
  --DROP TABLE sch_temp.teste;
  CREATE TABLE sch_temp.teste (gid serial primary key, longitude double
  precision);
  SELECT AddGeometrycolumn
  ('sch_temp','teste','geom_23030',23030,'LINESTRING',2);
  SELECT AddGeometrycolumn
  ('sch_temp','teste','geom_4258',4258,'LINESTRING',2);
  CREATE OR REPLACE FUNCTION funcao_teste() RETURNS trigger AS
  $$
  BEGIN
  -- Se o campo geom_4258 tem um novo INSERT ou UPDATE, entao actualiza
  geom_23030.
  NEW.geom_23030 = ST_Transform((NEW.geom_4258), 23030);
 
  -- Se o campo geom_23030 tem um novo INSERT ou UPDATE, entao actualiza
  geom_4258.
  NEW.geom_4258 = ST_Transform((NEW.geom_23030), 4258);
  -- Calcula/actualiza a longitude da geometria.
  NEW.longitude  = ST_Length(NEW.geom_23030);
  RETURN NEW;
  END;
  $$ LANGUAGE plpgsql;
  DROP TRIGGER IF EXISTS funcao_teste ON sch_temp.teste;
  CREATE TRIGGER funcao_teste BEFORE INSERT OR UPDATE ON sch_temp.teste FOR
  EACH ROW EXECUTE PROCEDURE funcao_teste();
  INSERT INTO sch_temp.teste(geom_23030)
  VALUES(ST_GeomFromText('SRID=23030;LINESTRING(232400 4548000,700882
  4548000)'));
  INSERT INTO sch_temp.teste(geom_4258) VALUES
  (ST_GeomFromText('SRID=4258;LINESTRING(-6 38,-1 38)'));
  UPDATE sch_temp.teste SET geom_4258 =
  ST_GeomFromText('SRID=4258;LINESTRING(-5 37,-1 37)') WHERE gid = 2;
  SELECT gid, longitude, ST_AsText(geom_23030), ST_AsText(geom_4258) FROM
  sch_temp.teste;
  Obrigado. Cumprimentos,
 


 Pelo que entendi você deve:
 - verificar qual é a operação (TG_OP);
 - se for INSERT, verificar em NEW qual foi a informada e calcular a
 outra, colocando o resultado em NEW;
 - se for UPDATE, verificar qual foi alterada e calcular a que não foi
 alterada, colocando o resultado em NEW;

 CREATE OR REPLACE FUNCTION funcao_teste() RETURNS trigger AS
 $$
 BEGIN
 IF (TG_OP = 'INSERT') THEN
IF (NEW.geom_4258 IS NOT NULL) THEN
-- Se o campo geom_4258 tem um novo INSERT, entao actualiza
 geom_23030.
 NEW.geom_23030 = ST_Transform((NEW.geom_4258), 23030);
 ELSE
-- Se o campo geom_23030 tem um novo INSERT, entao actualiza
 geom_4258.
 NEW.geom_4258 = ST_Transform((NEW.geom_23030), 4258);
 END IF;
 ELSE
IF (TG_OP = 'UPDATE') THEN
IF (NEW.geom_4258 IS NOT NULL) THEN
 NEW.geom_23030 = ST_Transform((NEW.geom_4258),
 23030);
 ELSE
IF (OLD.geom_23030 IS NOT NULL) THEN
 NEW.geom_4258 =
 ST_Transform((NEW.geom_23030), 4258);
 END IF;
END IF;
 END IF;
 RETURN NEW;
 END;
 $$ LANGUAGE plpgsql;

 ou algo nesta linha.

 Osvaldo
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



Obrigado Osvaldo, era isso mesmo que queria fazer.
Apenas nao funciona o ultimo UPDATE.
Simplificando o exemplo anterior:

--DROP TABLE sch_temp.teste;
CREATE TABLE sch_temp.teste (id serial primary key, x int, x100 int);

CREATE OR REPLACE FUNCTION funcao_teste() RETURNS trigger AS
$$
BEGIN
IF (TG_OP = 'INSERT') THEN
   IF (NEW.x IS NOT NULL) THEN
   NEW.x100 = NEW.x*100;
   ELSE
   NEW.x = NEW.x100/100;
   END IF;
ELSE
   IF (TG_OP = 'UPDATE') THEN
   IF (NEW.x IS NOT NULL) THEN
   NEW.x100 = NEW.x*100;
   ELSE
IF (OLD.x100 IS NOT NULL) THEN
   NEW.x = NEW.x/100;
END IF;
   END IF;
END IF;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS funcao_teste ON sch_temp.teste;
CREATE TRIGGER funcao_teste BEFORE INSERT OR UPDATE ON sch_temp.teste FOR
EACH ROW EXECUTE PROCEDURE

Re: [pgbr-geral] ajuda com disparador

2010-11-16 Por tôpico Eloi Ribeiro
On Tue, Nov 16, 2010 at 19:34, Osvaldo Kussama osvaldo.kuss...@gmail.comwrote:

 Em 16 de novembro de 2010 14:33, Eloi Ribeiro eloi.ribe...@gmail.com
 escreveu:
 
  Obrigado Osvaldo, era isso mesmo que queria fazer.
  Apenas nao funciona o ultimo UPDATE.
  Simplificando o exemplo anterior:
  --DROP TABLE sch_temp.teste;
  CREATE TABLE sch_temp.teste (id serial primary key, x int, x100 int);
  CREATE OR REPLACE FUNCTION funcao_teste() RETURNS trigger AS
  $$
  BEGIN
  IF (TG_OP = 'INSERT') THEN
 IF (NEW.x IS NOT NULL) THEN
 NEW.x100 = NEW.x*100;
 ELSE
 NEW.x = NEW.x100/100;
 END IF;
  ELSE
 IF (TG_OP = 'UPDATE') THEN
 IF (NEW.x IS NOT NULL) THEN
 NEW.x100 = NEW.x*100;
 ELSE
 IF (OLD.x100 IS NOT NULL) THEN
NEW.x = NEW.x/100;
  END IF;
 END IF;
  END IF;
  END IF;
  RETURN NEW;
  END;
  $$ LANGUAGE plpgsql;
  DROP TRIGGER IF EXISTS funcao_teste ON sch_temp.teste;
  CREATE TRIGGER funcao_teste BEFORE INSERT OR UPDATE ON sch_temp.teste FOR
  EACH ROW EXECUTE PROCEDURE funcao_teste();
  INSERT INTO sch_temp.teste(x) VALUES(1);
  INSERT INTO sch_temp.teste(x100) VALUES (200);
  SELECT * FROM sch_temp.teste;
  1;1;100
  2;2;200
  Os INSERTS funcionam na perfeição.
  UPDATE sch_temp.teste SET x = 3 WHERE x = 2;
  SELECT * FROM sch_temp.teste;
  1;1;100
  2;3;300
  O primeiro UPDATE também.
  UPDATE sch_temp.teste SET x100 = 200 WHERE x = 3;
  SELECT * FROM sch_temp.teste;
  1;1;100
  2;3;300
  Excepto este ultimo que não dispara. Porque?
  Aqui o resultado deveria ser:
  1;1;100
  2;2;200
  Obrigado por toda a ajuda.
  Eloi


 Creio que você precisa rever quais testes devem ser feitos.
 Talvez:
 IF (OLD.x100 IS NOT NULL) THEN
  NEW.x = NEW.x/100;
 END IF;
 deva, na realidade ser:
 IF (NEW.x100 IS NOT NULL) THEN
   NEW.x = NEW.x/100;
 END IF;

 Eu não entendi muito bem se sempre que atualizar uma coordenada a
 outra deve ser automaticamente modificada ou se isto depende de alguma
 outra informação ou pré-existência de dados.

 Osvaldo
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



Com esta ultima alteração os resultados são os mesmos.
Nao existe nenhuma outra dependência, ao actualizar  uma coordenada a
outra deve ser automaticamente modificada.

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] ajuda com disparador

2010-11-16 Por tôpico Eloi Ribeiro
On Tue, Nov 16, 2010 at 21:02, Osvaldo Kussama osvaldo.kuss...@gmail.comwrote:

 Em 16 de novembro de 2010 17:22, Eloi Ribeiro eloi.ribe...@gmail.com
 escreveu:
 
  Com esta ultima alteração os resultados são os mesmos.
  Nao existe nenhuma outra dependência, ao actualizar  uma coordenada a
  outra deve ser automaticamente modificada.
  Eloi


 IF (NEW.x100 IS NOT NULL) THEN
  NEW.x = NEW.x100/100;
 END IF;

 É isso? Calcular um novo x em função de x100?

 

 CREATE OR REPLACE FUNCTION funcao_teste() RETURNS trigger AS
 $$
 BEGIN
 IF (TG_OP = 'INSERT') THEN
IF (NEW.x IS NOT NULL) THEN
NEW.x100 = NEW.x*100;
ELSE
NEW.x = NEW.x100/100;
END IF;
 ELSE
IF (TG_OP = 'UPDATE') THEN
IF (NEW.x IS NOT NULL) THEN
NEW.x100 = NEW.x*100;
ELSE
 IF (NEW.x100 IS NOT NULL) THEN
 NEW.x = NEW.x100/100;
 END IF;
END IF;
END IF;
 END IF;
 RETURN NEW;
 END;
 $$ LANGUAGE plpgsql;


 Osvaldo
 __


Tens razão tinha ai um erro, mas mesmo assim com ultimo UPDATE (ver mais a
baixo) não se obtém o resultado esperado.
Não entendo o que está mal...

INSERT INTO sch_temp.teste(x) VALUES(1);
INSERT INTO sch_temp.teste(x100) VALUES (200);
SELECT * FROM sch_temp.teste;
1;1;100
2;2;200
Resultado esperado.

UPDATE sch_temp.teste SET x = 3 WHERE x = 2;
SELECT * FROM sch_temp.teste;
1;1;100
2;3;300
Resultado esperado.

UPDATE sch_temp.teste SET x100 = 200 WHERE x = 3;
SELECT * FROM sch_temp.teste;
1;1;100
2;3;300
Resultado NÃO esperado. Deveria ser:
1;1;100
2;2;200


Eloi
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] ajuda com disparador

2010-11-15 Por tôpico Eloi Ribeiro
Olá à lista,

Queria fazer um disparador sobre uma tabela com dois campos do
tipo 'Geometry' (geom_23030 e geom_4258) cada um com um sistema de
coordenadas diferente.

A ideia era que o disparador actualiza-se o segundo campo sempre que
houvesse um INSERT ou UPDATE no primeiro campo e assim tivessem sempre a
mesma geometria mas cada um dos campos com o seu respectivo sistemas de
coordenadas.

Devido à minha falta de experiência em plpgsql eu não sei como fazer para
que o disparador reconheça qual a geometria mais recente e proceder com
a actualização da mais antiga. Como tenho feito, actualiza por ordem de como
está indicado no disparador sem ter em conta a antiguidade. Deveria
adicionar dois novos campos com Time Stamp de cada uma das geometrias para
conseguir o meu objectivo?

Estou a usar algumas das funções disponibilizadas pela extensão PostGIS.
Isto foi o que consegui fazer:

--SELECT DropGeometryColumn('sch_temp','teste','geom_23030');
--SELECT DropGeometryColumn('sch_temp','teste','geom_4258');
--DROP TABLE sch_temp.teste;

CREATE TABLE sch_temp.teste (gid serial primary key, longitude double
precision);
SELECT AddGeometrycolumn
('sch_temp','teste','geom_23030',23030,'LINESTRING',2);
SELECT AddGeometrycolumn
('sch_temp','teste','geom_4258',4258,'LINESTRING',2);

CREATE OR REPLACE FUNCTION funcao_teste() RETURNS trigger AS
$$
BEGIN

-- Se o campo geom_4258 tem um novo INSERT ou UPDATE, entao actualiza
geom_23030.
NEW.geom_23030 = ST_Transform((NEW.geom_4258), 23030);

-- Se o campo geom_23030 tem um novo INSERT ou UPDATE, entao actualiza
geom_4258.
NEW.geom_4258 = ST_Transform((NEW.geom_23030), 4258);

-- Calcula/actualiza a longitude da geometria.
NEW.longitude  = ST_Length(NEW.geom_23030);

RETURN NEW;
END;
$$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS funcao_teste ON sch_temp.teste;
CREATE TRIGGER funcao_teste BEFORE INSERT OR UPDATE ON sch_temp.teste FOR
EACH ROW EXECUTE PROCEDURE funcao_teste();

INSERT INTO sch_temp.teste(geom_23030)
VALUES(ST_GeomFromText('SRID=23030;LINESTRING(232400 4548000,700882
4548000)'));
INSERT INTO sch_temp.teste(geom_4258) VALUES
(ST_GeomFromText('SRID=4258;LINESTRING(-6 38,-1 38)'));
UPDATE sch_temp.teste SET geom_4258 =
ST_GeomFromText('SRID=4258;LINESTRING(-5 37,-1 37)') WHERE gid = 2;

SELECT gid, longitude, ST_AsText(geom_23030), ST_AsText(geom_4258) FROM
sch_temp.teste;

Obrigado. Cumprimentos,


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] quantos campos tem uma tabela?

2010-09-24 Por tôpico Eloi Ribeiro
Olá à lista,

Existe uma maneira de saber quantos campos tem uma determinada tabela com
uma consulta SQL?
Obrigado!
Saudações,

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


Re: [pgbr-geral] quantos campos tem uma tabela?

2010-09-24 Por tôpico Eloi Ribeiro
OK, já encontrei a resposta, assim:

SELECT count(column_name) FROM information_schema.columns WHERE table_name
='nome_da_tabela';

Obrigado,

Eloi Ribeiro
GIS Analyst
39,45º -4,40º
http://eloiribeiro.wordpress.com


2010/9/24 Eloi Ribeiro eloi.ribe...@gmail.com

 Olá à lista,

 Existe uma maneira de saber quantos campos tem uma determinada tabela com
 uma consulta SQL?
 Obrigado!
 Saudações,

 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


Re: [pgbr-geral] Como converter DOY em data (AAAA-MM-DD)?

2010-09-02 Por tôpico Eloi Ribeiro
Bem respondo a mim mesmo.

Como tinha outro campo (tai93) com 'Seconds counted from UTC midnight Jan.
1, 1993' fiz:

UPDATE tabela SET date = CAST(tai93/86400 AS INT) + CAST('1993-01-01' AS
DATE);

E já tenho a data no formato desejado.

Obrigado, Ciao,

Eloi Ribeiro
GIS Analyst
39,45º -4,40º
http://eloiribeiro.wordpress.com


2010/9/2 Eloi Ribeiro eloi.ribe...@gmail.com

 Ola!

 Numa tabela tenho o campo 'year' (smallint) com o ano e o campo 'day_j'
 (smallint) com o dia do ano, de 1 a 366.
 Como faço para passar a data ISO 8601 (-MM-DD)?

 Obrigado pela atenção. Cumprimentos,

 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


Re: [pgbr-geral] Como converter DOY em data (AAAA-MM-DD)?

2010-09-02 Por tôpico Eloi Ribeiro
On Thu, Sep 2, 2010 at 14:24, Fabrízio de Royes Mello 
fabriziome...@gmail.com wrote:



 Em 2 de setembro de 2010 05:56, Eloi Ribeiro eloi.ribe...@gmail.comescreveu:

 Ola!

 Numa tabela tenho o campo 'year' (smallint) com o ano e o campo 'day_j'
 (smallint) com o dia do ano, de 1 a 366.
 Como faço para passar a data ISO 8601 (-MM-DD)?



 Tente:

 postg...@bdteste=# select extract(doy from current_date);
  date_part
 ---
245
 (1 row)

 postg...@bdteste=# select to_date('2010-245', '-DDD');
   to_date
 
  2010-09-02
 (1 row)



Boa, funciona estupendamente, terei em conta esta dica.

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


Re: [pgbr-geral] Serviço PostgreSQL não arranca em windows após apagado abrupto

2009-09-16 Por tôpico Eloi Ribeiro
2009/9/15 Tarcísio Sassara sassara.tarci...@gmail.com

 Me parece que você fechou a janela pela qual iniciou o serviço com o
 pg_ctl start

 Isso ocorreu comigo quando estava testando a versão binária do postgres 8.4
 no
 windows alguns dias atrás.

 Como resolvi:
 Quando fui encerrar o banco, abri uma segunda janela e
 executei o comando para parar o postgres com o comando pg_ctl stop...

 Se você conseguir tornar o postgres um serviço do windows,
 provavelmente não terá este problema.

 A versão do instalável do postgres 8.4 não te serve? Acho que com o
 instalador você terá mais sucesso.

 http://www.enterprisedb.com/products/pgdownload.do



Queria evitar uma nova instalação, o óptimo seria poder recuperar os dados.
eloi




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


Re: [pgbr-geral] Serviço PostgreSQL não arranca em windows após apagado abrupto

2009-09-16 Por tôpico Eloi Ribeiro
Obrigado pela dica Tiago, suponho que me servirá no futuro. A final optei
por desinstalar PostgreSQL 8.3 e instalei a nova versão (8.4) agora estou
restaurando a base de dados com calma e a deixar todo documentado, o que
antes não fiz.

Obrigado,

Eloi

2009/9/16 Tiago Adami adam...@gmail.com

 Para iniciar o banco através do console eu utilizo um atalho para o CMD.EXE
 no desktop, clico com o botão direito sobre o atalho e aciono o menu
 Executar Como. Seleciono o usuário postgres, informo a senha e o console
 é aberto rodando como usuário postgres.

 Desta forma, eu acesso o diretório de instalação do banco (no meu caso
 D:\PostgreSQL\8.3) e inicio o banco de dados através do comando:

 D:\PostgreSQL\8.3bin\postgres -D D:\PostgreSQL\8.3\data

 Todas as informações do log são impressas no console. Para encerrar o
 banco, apenas pressione CTRL+C, ou então feche a janela do MS-DOS.

 Depois de carregar o cluster desta forma, tente reindexar o banco através
 do reindexdb.exe em outro console.

 --
 TIAGO J. ADAMI
 http://www.adamiworks.com
 adamitj at gmail dot com
 Dois Vizinhos - PR

 2009/9/15 Eloi Ribeiro eloi.ribe...@gmail.com



 2009/9/15 André Volpato andre.volp...@ecomtecnologia.com.br

  Eloi Ribeiro escreveu:

 Olá a toda a lista,

 Tenho um computador com windows (xp prof. ver. 2002 com SP3), *PostgreSQL
 *8.3.5-2 e *PostGIS *1.3.5, este computador estava a realizar uma tarefa
 (de longa duração) de análise em *PostgreSQL+PostGIS* quando
 abruptamente o computador foi apagado, ao reiniciar o computador o serviço
 não arrancou registando no *log* as seguintes mensagens:

 2009-09-15 08:34:38 CEST LOG:  database system was interrupted while in
 recovery at 2009-09-14 14:06:32 CEST
 2009-09-15 08:34:38 CEST HINT:  This probably means that some data is
 corrupted and you will have to use the last backup for recovery.
 2009-09-15 08:34:38 CEST LOG:  database system was not properly shut
 down; automatic recovery in progress
 2009-09-15 08:34:38 CEST LOG:  redo starts at 67/C5C956D8
 2009-09-15 08:34:38 CEST LOG:  unexpected pageaddr 67/BDFD in log
 file 103, segment 197, offset 16580608
 2009-09-15 08:34:38 CEST LOG:  redo done at 67/C5FCFFB0
 2009-09-15 08:34:38 CEST FATAL:  index 9065509 contains unexpected zero
 page at block 0
 2009-09-15 08:34:38 CEST HINT:  Please REINDEX it.
 2009-09-15 08:34:38 CEST LOG:  startup process (PID 3476) exited with
 exit code 1
 2009-09-15 08:34:38 CEST LOG:  aborting startup due to startup process
 failure
 (...)


 Você tentou rodar um REINDEX, como está escrito no log ?

 []´s, ACV


 Não o tinha tentado. Suponho que é assim:
 postgres --single -D C:\Archivos de programa\PostgreSQL\8.3\data -P
 nome_da_bd

 e depois seria:
 REINDEX SYSTEM nome_da_bd

 Mas não consigo arrancar o *postmaster*, dá-me a seguinte mensagem:

 Execution of PostgreSQL by a user with administrative permissions is not
 permitted.
 The server must be started under an unprivileged user ID to prevent
 possible system security compromises. See the documentation for more
 information on how to properly start thr server.

 Reinicio a sessão com um utilizador não administrador, e tenho o seguinte:
 could  not create lock file postmaster.pid: Permission denied

 Alguma pista?

 eloi

 ___
 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




-- 
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] Serviço PostgreSQL não arranca em windows após apagado abrupto

2009-09-15 Por tôpico Eloi Ribeiro
Olá a toda a lista,

Tenho um computador com windows (xp prof. ver. 2002 com SP3),
*PostgreSQL *8.3.5-2
e *PostGIS *1.3.5, este computador estava a realizar uma tarefa (de longa
duração) de análise em *PostgreSQL+PostGIS* quando abruptamente o computador
foi apagado, ao reiniciar o computador o serviço não arrancou registando no
*log* as seguintes mensagens:

2009-09-15 08:34:38 CEST LOG:  database system was interrupted while in
recovery at 2009-09-14 14:06:32 CEST
2009-09-15 08:34:38 CEST HINT:  This probably means that some data is
corrupted and you will have to use the last backup for recovery.
2009-09-15 08:34:38 CEST LOG:  database system was not properly shut down;
automatic recovery in progress
2009-09-15 08:34:38 CEST LOG:  redo starts at 67/C5C956D8
2009-09-15 08:34:38 CEST LOG:  unexpected pageaddr 67/BDFD in log file
103, segment 197, offset 16580608
2009-09-15 08:34:38 CEST LOG:  redo done at 67/C5FCFFB0
2009-09-15 08:34:38 CEST FATAL:  index 9065509 contains unexpected zero
page at block 0
2009-09-15 08:34:38 CEST HINT:  Please REINDEX it.
2009-09-15 08:34:38 CEST LOG:  startup process (PID 3476) exited with exit
code 1
2009-09-15 08:34:38 CEST LOG:  aborting startup due to startup process
failure

Existe alguma maneira de por a base de dados outra vez a funcionar? Não
tenho um *dump *para um *restore*. Tenho sim os dados em csv, shp e
alguns *scripts
*sql para a criação de esquemas, usuários e algumas das tabelas.

Tentando remediar a situação, resolvi criar de zero um novo *cluster*, com
as seguintes sentencias:

--
initdb -U postgres -E UTF8 -D C:\Archivos de programa\PostgreSQL\8.3\data
pg_ctl -D C:\Archivos de programa\PostgreSQL\8.3\data -l logfile start
psql -U postgres -f C:\Archivos de
programa\PostgreSQL\8.3\share\contrib\adminpack.sql
createdb -U postgres -E UTF8 -O postgres -T postgres postgis
createlang -U postgres plpgsql postgis
psql -U postgres -d postgis -f C:\Archivos de
programa\PostgreSQL\8.3\share\contrib\lwpostgis.sql
psql -U postgres -d postgis -f C:\Archivos de
programa\PostgreSQL\8.3\share\contrib\spatial_ref_sys.sql
--

Este funciona perfeitamente até que deixa de funcionar ao fechar a consola
onde foram executadas as anteriores sentencias mencionadas!
Reiniciando o computador o serviço continua sem arrancar, tenho de abrir a
consola e executar de novo
pg_ctl -D C:\Archivos de programa\PostgreSQL\8.3\data -l logfile start
e não fechar a consola porque senão deixa de funcionar!

O que tenho de fazer para que o serviço de *PostgreSQL *arranque ao iniciar
o sistema operativo, seja tanto com o anterior *cluster *ou com o novo?

Fui ver se este serviço ainda existia, e parece estar tudo bem:
Em ferramentas administrativas-Serviços-PostgreSQL Database Server
8.3-Acesso ao executável: C:\Archivos de
programa\PostgreSQL\8.3\bin\pg_ctl.exe runservice -w -N pgsql-8.3 -D
C:\Archivos de programa\PostgreSQL\8.3\data\

Obrigado por ler e pelos comentários, espero que tenha exposto o meu
problema com claridade.

Atentamente,


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


Re: [pgbr-geral] Serviço PostgreSQL não arranca em windows após apagado abrupto

2009-09-15 Por tôpico Eloi Ribeiro
2009/9/15 André Volpato andre.volp...@ecomtecnologia.com.br

  Eloi Ribeiro escreveu:

 Olá a toda a lista,

 Tenho um computador com windows (xp prof. ver. 2002 com SP3), *PostgreSQL
 *8.3.5-2 e *PostGIS *1.3.5, este computador estava a realizar uma tarefa
 (de longa duração) de análise em *PostgreSQL+PostGIS* quando abruptamente
 o computador foi apagado, ao reiniciar o computador o serviço não arrancou
 registando no *log* as seguintes mensagens:

 2009-09-15 08:34:38 CEST LOG:  database system was interrupted while in
 recovery at 2009-09-14 14:06:32 CEST
 2009-09-15 08:34:38 CEST HINT:  This probably means that some data is
 corrupted and you will have to use the last backup for recovery.
 2009-09-15 08:34:38 CEST LOG:  database system was not properly shut down;
 automatic recovery in progress
 2009-09-15 08:34:38 CEST LOG:  redo starts at 67/C5C956D8
 2009-09-15 08:34:38 CEST LOG:  unexpected pageaddr 67/BDFD in log file
 103, segment 197, offset 16580608
 2009-09-15 08:34:38 CEST LOG:  redo done at 67/C5FCFFB0
 2009-09-15 08:34:38 CEST FATAL:  index 9065509 contains unexpected zero
 page at block 0
 2009-09-15 08:34:38 CEST HINT:  Please REINDEX it.
 2009-09-15 08:34:38 CEST LOG:  startup process (PID 3476) exited with exit
 code 1
 2009-09-15 08:34:38 CEST LOG:  aborting startup due to startup process
 failure
 (...)


 Você tentou rodar um REINDEX, como está escrito no log ?

 []´s, ACV


Não o tinha tentado. Suponho que é assim:
postgres --single -D C:\Archivos de programa\PostgreSQL\8.3\data -P
nome_da_bd

e depois seria:
REINDEX SYSTEM nome_da_bd

Mas não consigo arrancar o *postmaster*, dá-me a seguinte mensagem:

Execution of PostgreSQL by a user with administrative permissions is not
permitted.
The server must be started under an unprivileged user ID to prevent possible
system security compromises. See the documentation for more information on
how to properly start thr server.

Reinicio a sessão com um utilizador não administrador, e tenho o seguinte:
could  not create lock file postmaster.pid: Permission denied

Alguma pista?

eloi
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] update com um disparador

2008-12-09 Por tôpico Eloi Ribeiro
Ola a toda a lista.

Estou tentar fazer um disparador (trigger) que actualize um campo de uma
tabela com o campo de outra tabela. Se os campos estão na mesma tabela já
entendi como se faz, mas quando não é o caso como se poderia fazer?

exemplo:

create or replace function nome_funcao() returns trigger as '
begin

NEW.campo0 = NEW.campo1 + NEW.campo2; -- aqui tudo bem

-- aqui está a minha duvida, como fazer um update
UPDATE tabela1 SET campo0 = tabela2.campo0 FROM tabela2 where tabela1.id =
tabela2.id;

return NEW;
end;
' language plpgsql;
create trigger nome_disparador before insert or update on tabela1
for each row execute procedure nome_funcao();


Alguem me pode dar umas dicas?
Muito obrigado. Ciao,


-- 
Eloi Ribeiro

http://www.google.com/s2/profiles/100374240045472689555?zx=3p06h0iaagvn
eloi.ribeiro ARROBA gmail PONTO com
http://eloiribeiro.blogspot.com

España, Valencia

Antes de imprimir pensa que estará a gastar papel, tinta e energia.
Apaga todos os endereços de email do cabeçalho, bem como qualquer um
que apareça no corpo da mensagem. Essa informação é privada.
Coloca os endereços dos destinatários em BCC ou CCo.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] update com um disparador

2008-12-09 Por tôpico Eloi Ribeiro
Perfeito, era isso mesmo, muito obrigado Osvaldo.
Saudações,
Eloi

2008/12/9 Osvaldo Kussama [EMAIL PROTECTED]

 Em 09/12/08, Eloi Ribeiro[EMAIL PROTECTED] escreveu:
  Ola a toda a lista.
 
  Estou tentar fazer um disparador (trigger) que actualize um campo de uma
  tabela com o campo de outra tabela. Se os campos estão na mesma tabela já
  entendi como se faz, mas quando não é o caso como se poderia fazer?
 
  exemplo:
 
 
  create or replace function nome_funcao() returns trigger as '
  begin
 
  NEW.campo0 = NEW.campo1 + NEW.campo2; -- aqui tudo bem
 
  -- aqui está a minha duvida, como fazer um update
  UPDATE tabela1 SET campo0 = tabela2.campo0 FROM tabela2 where tabela1.id=
  tabela2.id;

 Pelo que entendi no lugar do UPDATE acima use:
 SELECT tabela2.campo0 INTO new.campo0 FROM tabela2 WHERE tabela2.id =
 new.id;


 
  return NEW;
  end;
  ' language plpgsql;
  create trigger nome_disparador before insert or update on tabela1
  for each row execute procedure nome_funcao();
 


 Osvaldo
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




-- 
Eloi Ribeiro

http://www.google.com/s2/profiles/100374240045472689555?zx=3p06h0iaagvn
eloi.ribeiro ARROBA gmail PONTO com
http://eloiribeiro.blogspot.com

España, Valencia

Antes de imprimir pensa que estará a gastar papel, tinta e energia.
Apaga todos os endereços de email do cabeçalho, bem como qualquer um
que apareça no corpo da mensagem. Essa informação é privada.
Coloca os endereços dos destinatários em BCC ou CCo.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] apagar registos repetidos

2008-11-06 Por tôpico Eloi Ribeiro
Saudações à lista,

Tenho a seguinte duvida:

Numa tabela onde existem registos repetidos, ou seja, onde a combinação
entre o campo1(smallint) e campo2(date) se repetem. Gostaria de eliminar
todos os registos repetidos excepto o que tenha no campo3(date) a data mais
recente.

|campo1 (smallint) | campo2 (date) | campo3 (date) |
|--|
| 1|  2008-06-12 |   2008-06-12| - eliminar
| 1|  2008-06-12 |   2008-11-06|
(...)


Muito obrigado pelas vossas sugestões.

Ciao,



-- 
Eloi Ribeiro

eloi.ribeiro ARROBA gmail PONTO com
http://eloiribeiro.blogspot.com

España, Valencia

Antes de imprimir pensa que estará a gastar papel, tinta e energia.
Apaga todos os endereços de email do cabeçalho, bem como qualquer um
que apareça no corpo da mensagem. Essa informação é privada.
Coloca os endereços dos destinatários em BCC ou CCo.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] update com a data mais recente desse registo

2008-09-01 Por tôpico Eloi Ribeiro
Olá à lista,

Tenho a seguinte duvida:

Numa tabela com a seguinte estrutura:
|-||-|--|
| id | data1(tipo:Date) | data2(tipo:Date) |  data3(tipo:Date) |
|-||-|--|
|  1 |   2006-10-02 |2006-10-23 |  |
(...)

Necessito actualizar o campo data3 com a data mais recente dos campos data1
e data2 do mesmo registo.

Tentei da seguinte maneira:

 UPDATE tabela SET data3 = max(data1, data2) WHERE
id = 1;

Mas não funcionou. Mesmo que funcionasse teria que repetir a consulta para
todos os id's existentes com recurso a um script ou gatilho, é possível
fazer-lo apenas com SQL, sem usar gatilho ou script?

Muito obrigado. atentamente,


-- 
Eloi Ribeiro

eloi.ribeiro ARROBA gmail PONTO com
http://eloiribeiro.blogspot.com

Espanha, Valência

Antes de imprimir pensa que estará a gastar papel, tinta e energia.
Apaga todos os endereços de email do cabeçalho, bem como qualquer um
que apareça no corpo da mensagem. Essa informação é privada.
Coloca os endereços dos destinatários em BCC ou CCo.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] update com a data mais recente desse registo

2008-09-01 Por tôpico Eloi Ribeiro
Não aceita os dois pontos

ERROR:  syntax error at or near :
LINE 129: ...la SET data3 = CASE WHEN data2  data1 : data2 else...

   ^
Alguma sugestão?

Estou utilizando a versão 8.2.7 em windows xp com pgAdmin III 1.8.4.


2008/9/1 William Leite Araújo [EMAIL PROTECTED]

 2008/9/1 Eloi Ribeiro [EMAIL PROTECTED]

 Olá à lista,

 Tenho a seguinte duvida:

 Numa tabela com a seguinte estrutura:
 |-||-|--
 |
 | id | data1(tipo:Date) | data2(tipo:Date) |  data3(tipo:Date) |
 |-||-|--
 |
 |  1 |   2006-10-02 |2006-10-23 |  |
 (...)

 Necessito actualizar o campo data3 com a data mais recente dos campos
 data1 e data2 do mesmo registo.

 Tentei da seguinte maneira:

  UPDATE tabela SET data3 = max(data1, data2) WHERE
 id = 1;

 Mas não funcionou.


 É porque a função max não existe. Você pode:
 1) Criá-la
 2) Mudar o teste


 Mesmo que funcionasse teria que repetir a consulta para todos os id's
 existentes com recurso a um script ou gatilho, é possível fazer-lo apenas
 com SQL, sem usar gatilho ou script?


 Uma simples consulta SQL, sem  a cláusula WHERE irá atualizar TODOS
 os registros da sua tabela.

 Ex.: *UPDATE* tabela *SET* data3 = *CASE WHEN* data2  data1 : data 2*ELSE
 * data1 *END*;



 Muito obrigado. atentamente,


 --
 Eloi Ribeiro

 eloi.ribeiro ARROBA gmail PONTO com
 http://eloiribeiro.blogspot.com

 Espanha, Valência

 Antes de imprimir pensa que estará a gastar papel, tinta e energia.
 Apaga todos os endereços de email do cabeçalho, bem como qualquer um
 que apareça no corpo da mensagem. Essa informação é privada.
 Coloca os endereços dos destinatários em BCC ou CCo.


 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




 --
 William Leite Araújo
 Analista de Banco de Dados - QualiConsult

 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




-- 
Eloi Ribeiro

eloi.ribeiro ARROBA gmail PONTO com
http://eloiribeiro.blogspot.com

Espanha, Valência

Antes de imprimir pensa que estará a gastar papel, tinta e energia.
Apaga todos os endereços de email do cabeçalho, bem como qualquer um
que apareça no corpo da mensagem. Essa informação é privada.
Coloca os endereços dos destinatários em BCC ou CCo.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] update com a data mais recente desse registo

2008-09-01 Por tôpico Eloi Ribeiro
ok já está mudei os deoi pontos por THEN e perfeito.
Muito obrigado pela ajuda!
ciao,
eloi

2008/9/1 Eloi Ribeiro [EMAIL PROTECTED]

 Não aceita os dois pontos

 ERROR:  syntax error at or near :
 LINE 129: ...la SET data3 = CASE WHEN data2  data1 : data2 else...

^
 Alguma sugestão?

 Estou utilizando a versão 8.2.7 em windows xp com pgAdmin III 1.8.4.


 2008/9/1 William Leite Araújo [EMAIL PROTECTED]

 2008/9/1 Eloi Ribeiro [EMAIL PROTECTED]

 Olá à lista,

 Tenho a seguinte duvida:

 Numa tabela com a seguinte estrutura:
 |-||-|--
 |
 | id | data1(tipo:Date) | data2(tipo:Date) |  data3(tipo:Date) |
 |-||-|--
 |
 |  1 |   2006-10-02 |2006-10-23 |  |
 (...)

 Necessito actualizar o campo data3 com a data mais recente dos campos
 data1 e data2 do mesmo registo.

 Tentei da seguinte maneira:

  UPDATE tabela SET data3 = max(data1, data2)
 WHERE id = 1;

 Mas não funcionou.


 É porque a função max não existe. Você pode:
 1) Criá-la
 2) Mudar o teste


 Mesmo que funcionasse teria que repetir a consulta para todos os id's
 existentes com recurso a um script ou gatilho, é possível fazer-lo apenas
 com SQL, sem usar gatilho ou script?


 Uma simples consulta SQL, sem  a cláusula WHERE irá atualizar TODOS
 os registros da sua tabela.

 Ex.: *UPDATE* tabela *SET* data3 = *CASE WHEN* data2  data1 : data 2*ELSE
 * data1 *END*;



 Muito obrigado. atentamente,


 --
 Eloi Ribeiro

 eloi.ribeiro ARROBA gmail PONTO com
 http://eloiribeiro.blogspot.com

 Espanha, Valência

 Antes de imprimir pensa que estará a gastar papel, tinta e energia.
 Apaga todos os endereços de email do cabeçalho, bem como qualquer um
 que apareça no corpo da mensagem. Essa informação é privada.
 Coloca os endereços dos destinatários em BCC ou CCo.


 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




 --
 William Leite Araújo
 Analista de Banco de Dados - QualiConsult

 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




 --
 Eloi Ribeiro

 eloi.ribeiro ARROBA gmail PONTO com
 http://eloiribeiro.blogspot.com

 Espanha, Valência

 Antes de imprimir pensa que estará a gastar papel, tinta e energia.
 Apaga todos os endereços de email do cabeçalho, bem como qualquer um
 que apareça no corpo da mensagem. Essa informação é privada.
 Coloca os endereços dos destinatários em BCC ou CCo.




-- 
Eloi Ribeiro

eloi.ribeiro ARROBA gmail PONTO com
http://eloiribeiro.blogspot.com

Espanha, Valência

Antes de imprimir pensa que estará a gastar papel, tinta e energia.
Apaga todos os endereços de email do cabeçalho, bem como qualquer um
que apareça no corpo da mensagem. Essa informação é privada.
Coloca os endereços dos destinatários em BCC ou CCo.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] update com a data mais recente desse registo

2008-09-01 Por tôpico Eloi Ribeiro
pode ser, mas sem essa ajuda não teria chagado ao resultado. obrigado
abraço,

eloi

2008/9/1 William Leite Araújo [EMAIL PROTECTED]

   Ops... acho que programar em Java está afetando meus SQL... =D

 2008/9/1 William Leite Araújo [EMAIL PROTECTED]

 (...)
 Ex.: *UPDATE* tabela *SET* data3 = *CASE WHEN* data2  data1 : data 2*ELSE
 * data1 *END*;


 (...)


  Correto: *UPDATE* tabela *SET* data3 = *CASE WHEN* data2  data1 *
 THEN* data 2* ELSE* data1 *END*;

 --
 William Leite Araújo
 Analista de Banco de Dados - QualiConsult

 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




-- 
Eloi Ribeiro

eloi.ribeiro ARROBA gmail PONTO com
http://eloiribeiro.blogspot.com

Espanha, Valência

Antes de imprimir pensa que estará a gastar papel, tinta e energia.
Apaga todos os endereços de email do cabeçalho, bem como qualquer um
que apareça no corpo da mensagem. Essa informação é privada.
Coloca os endereços dos destinatários em BCC ou CCo.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] update com a data mais recente desse registo

2008-09-01 Por tôpico Eloi Ribeiro
Obrigado Osvaldo, terei em conta a sugestão.
saudações,
eloi


2008/9/1 Osvaldo Kussama [EMAIL PROTECTED]

 Em 01/09/08, Eloi Ribeiro[EMAIL PROTECTED] escreveu:
 
  Tenho a seguinte duvida:
 
  Numa tabela com a seguinte estrutura:
 
 |-||-|--|
  | id | data1(tipo:Date) | data2(tipo:Date) |  data3(tipo:Date) |
 
 |-||-|--|
  |  1 |   2006-10-02 |2006-10-23 |  |
  (...)
 
  Necessito actualizar o campo data3 com a data mais recente dos campos
 data1
  e data2 do mesmo registo.
 
  Tentei da seguinte maneira:
 
   UPDATE tabela SET data3 = max(data1, data2)
 WHERE
  id = 1;
 
  Mas não funcionou. Mesmo que funcionasse teria que repetir a consulta
 para
  todos os id's existentes com recurso a um script ou gatilho, é possível
  fazer-lo apenas com SQL, sem usar gatilho ou script?
 


 Utilize GREATEST:
 UPDATE tabela SET data3 = GREATEST(data1, data2) WHERE id = 1;

 http://www.postgresql.org/docs/current/interactive/functions-conditional.html#AEN14508

 Osvaldo
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




-- 
Eloi Ribeiro

eloi.ribeiro ARROBA gmail PONTO com
http://eloiribeiro.blogspot.com

Espanha, Valência

Antes de imprimir pensa que estará a gastar papel, tinta e energia.
Apaga todos os endereços de email do cabeçalho, bem como qualquer um
que apareça no corpo da mensagem. Essa informação é privada.
Coloca os endereços dos destinatários em BCC ou CCo.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] PostGIS

2008-08-12 Por tôpico Eloi Ribeiro
Manual PostGIS http://www.webgis.com.br/postgis/

Sumário

PostGIS é uma extensão ao sistema de banco de dados object-relational
PostgreSQL, que permite o uso de objetos GIS (Sistemas de Informação
Geográfica) serem armazenados em banco de dados. PostGIS inclui suporte
para índices espacias GiST-based R-Tree e funções para análise e
processamento de objetos GIS.

Este é um manual da versão 1.2.2SVN

Boa sorte,

Eloi



2008/8/12 Marcelo Costa [EMAIL PROTECTED]

 Olá, bom dia!

 2008/8/12 Cézar Augusto Ferreira [EMAIL PROTECTED]

 Galera, alguém sabe onde eu consigo material sobre PostGIS, cartografia,
 Sistemas de coordenadas, essas paradas assim?
 Obrigado!


 Procure por 
 http://www.geolivre.org.br/http://www.geolivre.org.br/downloads/geozine/geozine-n01-v20-16ago2007.pdf,
 há artigos e tutoriais que podem te ajudar.

 Att,


 --
 Marcelo Costa

 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




-- 
Eloi Ribeiro

eloi.ribeiro ARROBA gmail PONTO com
http://eloi-ribeiro.blogspot.com

Espanha, Valência

Antes de imprimir pensa que estará a gastar papel, tinta e energia.

Apaga todos os endereços de email do cabeçalho, bem como qualquer um
que apareça no corpo da mensagem. Essa informação é privada e não publica.

Protege os endereços dos destinatários colocando os mesmos em BCC ou CCo.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] especificar a nova localização do cluster no boot do sistema

2008-07-03 Por tôpico Eloi Ribeiro
Obrigado pelos vossos comentários foram de grande ajuda.

Ciao,

Eloi


2008/7/1 Leonardo Cezar [EMAIL PROTECTED]:

 2008/6/30 Eloi Ribeiro [EMAIL PROTECTED]:
  Obrigado pela resposta.

 http://www.postgresql.org.br/RegrasLista

  Duvidas:
 
  1. É mesmo necessário o drop do cluster '/var/lib/postgresql/8.3/main/'?

 Se refere-se a uma instalação do Debian, não. Utilize
 pg_upgradecluster ao invés.

  2. Com 'pg_createcluster -u postgres --start-conf 8.3 seucluster' vou
  criar outro cluster? Certo?. Mas já o tenho criado em
  '/media/HDB/PostgreSQL/Data', apenas quero que quando inicie o PC e
  entre em psql o cluster seja este '/media/HDB/PostgreSQL/Data' e não
  este '/var/lib/postgresql/8.3/main/'.

 Visualize seus clusters em execução (pg_lsclister) e escolha um dos
 métodos:

 * psql --cluster 8.3/main ;
 * export PGCLUSTER=8.3/main;
 * echo nome_user\tgroup\t8.3\tmain\tpostgres 
 /etc/ostgresql-common/user_clusters;
 * echo nome_user\tgroup\t8.3\tmain\tpostgres  $HOME/.postgresqlrc

  De momento o que faço para mudar de cluster é:
  su postgres
  /etc/init.d/postgresql-8.3 stop
  /usr/lib/postgresql/8.3/bin/pg_ctl -D /media/HDB/PostgreSQL/Data start

 pg_ctlcluster 8.3 nome_cluster stop

  Mas resulta incomodo fazer-lo cada vez que inicio o PC e gostaria de
  saber como o configurar.

 Altere o valor de start.conf

 Abraço!

 -Leo
 --
 Leonardo Cezar
 http://pgcon.postgresql.org.br
 http://www.dextra.com.br/postgres




-- 
Eloi Ribeiro

eloi.ribeiro ARROBA gmail PONTO com
http://eloi-ribeiro.blogspot.com

Espanha, Valência

Antes de imprimir pensa que estará a gastar papel, tinta e energia.

Apaga todos os endereços de email do cabeçalho, bem como qualquer um
que apareça no corpo da mensagem. Essa informação é privada e não publica.

Protege os endereços dos destinatários colocando os mesmos em BCC ou CCo.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] especificar a nova localização do cluster no boot do sistema

2008-06-30 Por tôpico Eloi Ribeiro
Obrigado pela resposta.

Se entendo bem, sugeres que faça um drop do cluster que foi criado por
defeito na instalação, em /var/lib/postgresql/8.3/main/, e crie um novo.
E isso?

Duvidas:

1. É mesmo necessário o drop do cluster '/var/lib/postgresql/8.3/main/'?

2. Com 'pg_createcluster -u postgres --start-conf 8.3 seucluster' vou
criar outro cluster? Certo?. Mas já o tenho criado em
'/media/HDB/PostgreSQL/Data', apenas quero que quando inicie o PC e
entre em psql o cluster seja este '/media/HDB/PostgreSQL/Data' e não
este '/var/lib/postgresql/8.3/main/'.

De momento o que faço para mudar de cluster é:
su postgres
/etc/init.d/postgresql-8.3 stop
/usr/lib/postgresql/8.3/bin/pg_ctl -D /media/HDB/PostgreSQL/Data start

Mas resulta incomodo fazer-lo cada vez que inicio o PC e gostaria de
saber como o configurar.

Espero que me tenha explicado bem. Muito obrigado pelas sugestões.

Saudações,

Eloi

Seg, 2008-06-30 às 09:01 -0300, Fernando Ike de Oliveira escreveu:
 Em Fri, 27 Jun 2008 21:30:17 +0200
 Eloi Ribeiro [EMAIL PROTECTED] escreveu:
 
  Olá a toda a lista, tenho a seguinte duvida.
  
  Estou a usando Ubuntu 8.04 e recentemente instalei PostgreSQL 8.3,
  criei um novo cluster em /media/HDB/PostgreSQL/Data. Arranquei a base
  de dados nesse cluster, cria umas base de dados de testes e tudo
  funciona perfeito, mas quando reinicio o PC o cluster passa á
  localização original de quando foi instalado PostgreSQL. Poderiam
  dizer como posso especificar a nova localização do cluster no boot do
  sistema.
 
 
  Eloi, 
 
 
   Isso acontece porque no Debian e derivados tem alguns scripts para
 facilitar o uso de várias instâncias de PostgreSQL na mesma máquina.
 Com o backup feito, para remover do local original e adicionar um
 novo cluster faça:
 
 #pg_dropcluster 8.3 main
 #pg_createcluster -u postgres --start-conf 8.3 seucluster
 
 
 Saudações,

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral