Re: [pgbr-geral] ajuda com consulta
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
Re: [pgbr-geral] ajuda com consulta
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
[pgbr-geral] ajuda com consulta
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] ERROR: could not write to hash-join temporary file: No space left on device
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
Re: [pgbr-geral] ERROR: could not write to hash-join temporary file: No space left on device
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
[pgbr-geral] ERROR: could not write to hash-join temporary file: No space left on device
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] ajuda com funcao
On 2014-06-13 12:02, Matheus de Oliveira wrote: 2014-06-13 6:39 GMT-03:00 Eloi Ribeiro : 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
[pgbr-geral] ajuda com funcao
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] Migração de postgres + solr para postgres + postGIS
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
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
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
[pgbr-geral] duvida com as aspas dentro de aspas ao criar função
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
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
Re: [pgbr-geral] ajuda com função
On 2013-12-18 15:23, Matheus de Oliveira wrote: 2013/12/18 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, 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
[pgbr-geral] separar caracteres minúsculos dos maiúsculos
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] Consulta com 'NOT IN' devolve resultado não esperado
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
[pgbr-geral] Consulta com 'NOT IN' devolve resultado não esperado
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] PostGis
> 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 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 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 Specify the character encoding of Shape's attribute column. (default : "WINDOWS-1252"), iso-8859-1 (codificacao Latin-1) -N 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] PostGis
> 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] Saber a dif min entre timestamp's de duas tabelas
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 escreveu: > Em 27 de julho de 2012 12:50, Eloi Ribeiro > 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
Re: [pgbr-geral] Saber a dif min entre timestamp's de duas tabelas
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] Saber a dif min entre timestamp's de duas tabelas
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
[pgbr-geral] Fwd: [SIG] Database/Programming specialist - Wageningen, Netherlands
-- 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=118&tx_list_pi1%5Bmode%5D=5&cHash=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
Re: [pgbr-geral] Trigger não dispara
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 escreveu: > 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 escreveu: > >> 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] Trigger não dispara
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] Trigger não dispara
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 escreveu: > > > Em 26 de março de 2012 07:36, Eloi Ribeiro escreveu: > >> Olá a todos, >> >> >> >> >> CREATE TRIGGER trg_t_incendio BEFORE INSERT OR UPDATE ON t_incendio FOR >> EACH ROW EXECUTE PROCEDURE fun_teste(); >> >> >> > > 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
[pgbr-geral] Trigger não dispara
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] Ajuda com função - adicionar campo dentro de uma função
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 - > LCAD<http://www.lcad.icmc.usp.br/> > Instituto de Ciências Matemáticas e de Computação - > ICMC<http://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 wrote: > >> 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 - >>> LCAD<http://www.lcad.icmc.usp.br/> >>> Instituto de Ciências Matemáticas e de Computação - >>> ICMC<http://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 >>> wrote: >>> >>>> 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 co
Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função
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 - > LCAD<http://www.lcad.icmc.usp.br/> > Instituto de Ciências Matemáticas e de Computação - > ICMC<http://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 wrote: > >> 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
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
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 escreveu: > Em 12 de março de 2012 07:11, Eloi Ribeiro > 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
Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função
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
[pgbr-geral] Ajuda com função - adicionar campo dentro de uma função
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] Limites e performance do Postgres com Postgis
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
> > > 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
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 > >> 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
Re: [pgbr-geral] passar tabelas de um esquema para outro
2011/5/4 JotaComm > 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] passar tabelas de um esquema para outro
2011/5/4 Joao Cosme de Oliveira Junior > 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 > > 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/5/4 Fabrízio de Royes Mello 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
[pgbr-geral] passar tabelas de um esquema para outro
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.sql>ficheiro2.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] função: como criar series sem que se multipliquem
2011/4/6 Luiz Matsumura > Já que está usando pl/pgsql por que não fazer um loop FOR ? > > algo como > > FOR i IN 1..100 LOOP > > INSERT INTO sch_ambiente.escv_incendios_puntos_muestreo( poi_code, > fir_code, fir_name, geom) >VALUES ( i , new.fir_code , new.fir_name , (select ) ); > > END LOOP; > > > > Em 5 de abril de 2011 05:40, Eloi Ribeiro > 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
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
Re: [pgbr-geral] duvida com disparador: eliminar registos desactualizados.
2011/3/25 Osvaldo Kussama > 2011/3/25, Eloi Ribeiro : > > On Fri, Mar 25, 2011 at 13:57, Osvaldo Kussama > > wrote: > > > >> 2011/3/25, 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; > >> > > >> >
Re: [pgbr-geral] duvida com disparador: eliminar registos desactualizados.
On Fri, Mar 25, 2011 at 13:57, Osvaldo Kussama wrote: > 2011/3/25, 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;*/ > > - > > > > > 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
[pgbr-geral] duvida com disparador: eliminar registos desactualizados.
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] consulta SQL que devolva uma lista com todos os dias de um determinado mês
2011/3/14 Emerson Hermann > 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 > escreveu: > > > > Em 14 de março de 2011 07:13, Eloi Ribeiro > > 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
Re: [pgbr-geral] consulta SQL que devolva uma lista com todos os dias de um determinado mês
2011/3/14 Fabrízio de Royes Mello > > Em 14 de março de 2011 07:13, Eloi Ribeiro 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 > > 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
[pgbr-geral] consulta SQL que devolva uma lista com todos os dias de um determinado mês
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] tratar nulls como zeros
Fantastico, era isso mesmo. Obrigado! Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com 2011/3/8 Tiago Adami > Em 8 de março de 2011 12:50, Eloi Ribeiro > 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:04";"";"";"";"01: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] tratar nulls como zeros
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:04";"";"";"";"01: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] consulta de agregaçao (GROUP BY ) e com uma restriçao WHERE?
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 > 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 > escreveu: > >> 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
[pgbr-geral] consulta de agregaçao (GROUP BY ) e com uma restriçao WHERE?
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] ajuda com disparador
0267.75646057,675714.208368959 4207910.10029429)";"LINESTRING(-6 38,-1 38)" *Testando UPDATE:* UPDATE sch_temp.teste SET geom_23030 = ST_GeomFromText('SRID=23030;LINESTRING(25 470,705000 470)') WHERE gid = 1; 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; --1;455000;"LINESTRING(25 470,705000 470)";"LINESTRING(-6.03947581959512 42.4101587355779,-0.509472631922339 42.4233762846083)" --2;355923.537746918;"LINESTRING(322150.259231365 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
On Tue, Nov 16, 2010 at 21:02, Osvaldo Kussama wrote: > Em 16 de novembro de 2010 17:22, Eloi Ribeiro > 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
Re: [pgbr-geral] ajuda com disparador
On Tue, Nov 16, 2010 at 19:34, Osvaldo Kussama wrote: > Em 16 de novembro de 2010 14:33, Eloi Ribeiro > 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 Osvaldo Kussama > Em 15 de novembro de 2010 14:38, Eloi Ribeiro > 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_t
[pgbr-geral] ajuda com disparador
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
Re: [pgbr-geral] ajuda com consulta sql
Genial! Com 'DISTINCT ON (iso3166_2)' devolve apenas um registo por pais e com 'ORDER BY iso3166_2, area DESC ' devolve apenas a área de maior valor. Muito bem. Muito obrigado, solucionado! Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com On Wed, Nov 3, 2010 at 13:08, Fabrízio de Royes Mello < fabriziome...@gmail.com> wrote: > > > 2010/11/3 Eloi Ribeiro > >> >> >> >> SELECT * FROM vw_globalfires_country_biome_max02; >> "AD";"Temperate Broadleaf and Mixed Forests";0.0520229 >> "AE";"Deserts and Xeric Shrublands";6.20797 >> "AF";"Deserts and Xeric Shrublands";49.9593 >> "AG";"Deserts and Xeric Shrublands";0.0279382 >> (...) >> >> >> > Veja se resolve: > > SELECT DISTINCT ON (iso3166_2) >iso3166_2, >biome, >area > FROM vw_globalfires_country_biome > ORDER BY iso3166_2, > area DESC ; > > -- > 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
[pgbr-geral] ajuda com consulta sql
Olá a todos, Tenho uma vista com dados da soma da superfície de Biomas por Pais. Com os seguintes campos: iso3166_2 -> codigo de pais biome -> bioma area-> superficie que ocupa esse bioma SELECT * FROM vw_globalfires_country_biome; "AD";"Temperate Broadleaf and Mixed Forests";0.0520229 "AE";"Deserts and Xeric Shrublands";6.20797 "AE";"Temperate Grasslands + Savannas + Shrublands";0.00838532 "AF";"Deserts and Xeric Shrublands";49.9593 "AF";"Montane Grasslands and Shrublands";10.8551 "AF";"Temperate Coniferous Forests";1.26231 "AG";"Deserts and Xeric Shrublands";0.0279382 "AG";"Tropical and Subtropical Dry Broadleaf Forests";0.00611668 "AG";"Tropical and Subtropical Moist Broadleaf Forests";0.00229229 (...) Gostaria criar uma vista a partir da anterior onde aparecessem apenas os biomas com maior área por pais. A única maneira que encontro, è primeiro criar uma vista intermédia e a partir de esta criar a definitiva, mas parece-me uma solução pouco elegante. Algum me poderia indicar como criar esta vista sem uma vista/tabela intermédia? Esta foi a solução (pouco elegante) que encontrei: CREATE OR REPLACE VIEW vw_globalfires_country_biome_max01 AS SELECT iso3166_2, max(area) AS area FROM vw_globalfires_country_biome GROUP BY iso3166_2; CREATE OR REPLACE VIEW vw_globalfires_country_biome_max02 AS SELECT a.iso3166_2, b.biome, a.area FROM vw_globalfires_country_biome_max01 a, vw_globalfires_country_biome b WHERE a.area = b.area ORDER BY a.iso3166_2; SELECT * FROM vw_globalfires_country_biome_max02; "AD";"Temperate Broadleaf and Mixed Forests";0.0520229 "AE";"Deserts and Xeric Shrublands";6.20797 "AF";"Deserts and Xeric Shrublands";49.9593 "AG";"Deserts and Xeric Shrublands";0.0279382 (...) 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] quantos campos tem uma tabela?
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 > 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
[pgbr-geral] quantos campos tem uma tabela?
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)?
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 escreveu: > > 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] Como converter DOY em data (AAAA-MM-DD)?
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 > 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 (AAAA-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
[pgbr-geral] Como converter DOY em data (AAAA-MM-DD)?
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] tabelas a que um determinado utilizador tem GRANT SELECT?
2009/11/2 Leonardo Cezar > 2009/11/2 Eloi Ribeiro : > > > Como buscar nas tabelas de sistema do postgresql, todas as tabelas a que > um > > determinado ROLE tem GRANT SELECT? > > SELECT table_schema,table_name,grantee > FROM information_schema.role_table_grants > WHERE grantee = $$meu_usuario$$ > AND privilege_type = $$SELECT$$; > > Abraço! > > -Leo > -- > Leonardo Cezar > http://www.aslid.org.br > http://postgreslogia.wordpress.com > http://www.dextra.com.br/postgres > Muito obrigado Leo, era isso mesmo que procurava. Abraço, 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
[pgbr-geral] tabelas a que um determinado utilizador tem GRANT SELECT?
Bom dia, Como buscar nas tabelas de sistema do postgresql, todas as tabelas a que um determinado ROLE tem GRANT SELECT? 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
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 > 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.3>bin\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 > >> >> >> 2009/9/15 André Volpato >> >> 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
Re: [pgbr-geral] Serviço PostgreSQL não arranca em windows após apagado abrupto
2009/9/15 Tarcísio Sassara > 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/9/15 André Volpato > 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] Serviço PostgreSQL não arranca em windows após apagado abrupto
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] update com um disparador
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] update com um disparador
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] apagar registos repetidos
Muito obrigado, Está solucionado. Sabia que isto era canja para vocês. xau, Eloi 2008/11/6 Jota <[EMAIL PROTECTED]> > Olá, > > No meu blog tem um post sobre como resolver esse tipo de problema > (http://jotacomm.wordpress.com). > > []s > > > > > 2008/11/6 William Leite Araújo <[EMAIL PROTECTED]>: > > Sugestão: > > > > 1 ) Crie uma tabela temporária com os dados que deseja manter (registros > com > > campo3 maior). > > 2) Delete os registros da tabela que não estejam na tabela temporaria; > > > > Ex.: > > > > BEGIN; > > CREATE TEMP TABLE mantidos AS > >SELECT campo1 as t1,campo2 as t2,max(campo3), count(1) > >FROM [tabela] GROUP BY campo1, campo2; > > > > DELETE FROM [tabela] WHERE (campo1,campo2,campo3) NOT IN (SELECT > t1,t2,max > > FROM mantidos ); > > > > END; > > > >Funcionará caso a tripla (campo1,campo2,campo3) não contenha nulos nem > se > > repita. > > > > 2008/11/6 Eloi Ribeiro <[EMAIL PROTECTED]> > >> > >> 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 > >> > > > > > > > > -- > > William Leite Araújo > > Mobile Solution Manager - QualiConsult > > Analista de Banco de Dados > > > > ___ > > pgbr-geral mailing list > > pgbr-geral@listas.postgresql.org.br > > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > > > > > > > > -- > João Paulo > www.dextra.com.br/postgres > PostgreSQL > ___ > 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] apagar registos repetidos
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
Re: [pgbr-geral] update com a data mais recente desse registo
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] update com a data mais recente desse registo
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
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
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
[pgbr-geral] update com a data mais recente desse registo
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] PostGIS
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
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 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
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
[pgbr-geral] especificar a nova localização do cluster no boot do sistema
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. Muito obrigado. Atentamente, Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral