Re: [pgbr-geral] Ajuda com função
Em 28 de setembro de 2015 06:41, Eloiescreveu: > On 2015-09-25 10:33, Eloi wrote: > >> 1) A função não esta a funcionar devidamente. Suponho que relacionado >> com esta parte: >> AND t2.country_id = '||$$'$$||quote_ident(country_code)||$$'$$ >> Algo esta mal que não consigo identificar. >> > > O quote_ident() sobra, julgo que porque se trata de uma string e não de um > objeto. > Assim já funciona: > AND t2.country_id = '||$$'$$||country_code||$$'$$ > Como você queria representar os dados? quote_ident vai colocar eles entre aspas duplas. Talvez o bloco todo possa ser reescrito com quote_literal: AND t2.country_id = QUOTE_LITERAL(country_code) Dê uma olhada nos detalhes na doc[1]. Um abraço! [1] http://www.postgresql.org/docs/9.4/static/functions-string.html -- Sebastian Webber http://swebber.me ___ 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 2015-09-28 16:21, Sebastian Webber wrote: AND t2.country_id = '||$$'$$||country_code||$$'$$ Como você queria representar os dados? quote_ident vai colocar eles entre aspas duplas. Talvez o bloco todo possa ser reescrito com quote_literal: AND t2.country_id = QUOTE_LITERAL(country_code) Sim é isso, não conhecia QUOTE_LITERAL(), fica muito mais simples. Obrigado! Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Ajuda com função
On 2015-09-25 10:33, Eloi wrote: 1) A função não esta a funcionar devidamente. Suponho que relacionado com esta parte: AND t2.country_id = '||$$'$$||quote_ident(country_code)||$$'$$ Algo esta mal que não consigo identificar. O quote_ident() sobra, julgo que porque se trata de uma string e não de um objeto. Assim já funciona: AND t2.country_id = '||$$'$$||country_code||$$'$$ Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Ajuda com Função
Ao usar a seguinte função http://paste.ubuntu.com/9543365/ Estou recebendo um erro, informando que a função atingiu o fim e não encontrou um retorno. Não tenho muita experiência com PLPGSQL mas acredito que o retorno final está lá (RETURN sucess;) -- Matheus Saraiva da Silva Chapecó - SC ___ 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
2014-12-16 17:47 GMT-02:00 Matheus Saraiva matheus.sara...@gmail.com: Ao usar a seguinte função http://paste.ubuntu.com/9543365/ Estou recebendo um erro, informando que a função atingiu o fim e não encontrou um retorno. Não tenho muita experiência com PLPGSQL mas acredito que o retorno final está lá (*RETURN sucess;*) Aquele RETURN na linha 27 está dentro do bloco de exceções. Mova essa linha para antes da EXCEPTION, linha 15. Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres ___ 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
Em Ter, 2014-12-16 às 17:56 -0200, Matheus de Oliveira escreveu: 2014-12-16 17:47 GMT-02:00 Matheus Saraiva matheus.sara...@gmail.com: Ao usar a seguinte função http://paste.ubuntu.com/9543365/ Estou recebendo um erro, informando que a função atingiu o fim e não encontrou um retorno. Não tenho muita experiência com PLPGSQL mas acredito que o retorno final está lá (RETURN sucess;) Aquele RETURN na linha 27 está dentro do bloco de exceções. Mova essa linha para antes da EXCEPTION, linha 15. Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral Ok, deu certo. Esse bloco exception é diferente do que eu imaginava, achei quele ele terminasse quando não encontrasse mais clausulas when then. Pelo visto ele não tem um delimitador que marque o seu fim. -- Matheus Saraiva da Silva Chapecó - SC ___ 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
Em 16/12/14, Matheus Saraivamatheus.sara...@gmail.com escreveu: Em Ter, 2014-12-16 às 17:56 -0200, Matheus de Oliveira escreveu: 2014-12-16 17:47 GMT-02:00 Matheus Saraiva matheus.sara...@gmail.com: Ao usar a seguinte função http://paste.ubuntu.com/9543365/ Estou recebendo um erro, informando que a função atingiu o fim e não encontrou um retorno. Não tenho muita experiência com PLPGSQL mas acredito que o retorno final está lá (RETURN sucess;) Aquele RETURN na linha 27 está dentro do bloco de exceções. Mova essa linha para antes da EXCEPTION, linha 15. Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral Ok, deu certo. Esse bloco exception é diferente do que eu imaginava, achei quele ele terminasse quando não encontrasse mais clausulas when then. Pelo visto ele não tem um delimitador que marque o seu fim. -- De: http://www.postgresql.org/docs/current/interactive/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING If no error occurs, this form of block simply executes all the statements, and then control passes to the next statement after END. But if an error occurs within the statements, further processing of the statements is abandoned, and control passes to the EXCEPTION list. The list is searched for the first condition matching the error that occurred. If a match is found, the corresponding handler_statements are executed, and then control passes to the next statement after END. Osvaldo ___ 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
Em 16/12/2014 18:11, Matheus Saraiva matheus.sara...@gmail.com escreveu: Em Ter, 2014-12-16 às 17:56 -0200, Matheus de Oliveira escreveu: 2014-12-16 17:47 GMT-02:00 Matheus Saraiva matheus.sara...@gmail.com: Ao usar a seguinte função http://paste.ubuntu.com/9543365/ Estou recebendo um erro, informando que a função atingiu o fim e não encontrou um retorno. Não tenho muita experiência com PLPGSQL mas acredito que o retorno final está lá (RETURN sucess;) Aquele RETURN na linha 27 está dentro do bloco de exceções. Mova essa linha para antes da EXCEPTION, linha 15. Ok, deu certo. Esse bloco exception é diferente do que eu imaginava, achei quele ele terminasse quando não encontrasse mais clausulas when then. Pelo visto ele não tem um delimitador que marque o seu fim. O final de cada WHEN seria até encontrar o próximo WHEN ou, no caso do último, até encontrar a cláusula END. Lembre-se que você pode aninhar blocos BEGIN/EXCEPTION/END, assim você pode ter um bloco interno: BEGIN ... BEGIN ... EXCEPTION ... END RETURN ...; END; -- Matheus Saraiva da Silva Chapecó - SC ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] ajuda com função
Ola a toda a lista, Estou a tentar fazer funcionar a seguinte função para mover todas as tabelas de um esquema para outro. Não obtenho nenhum erro mas no entanto nada é movido. Peculiaridades: o nome do esquema de origem está em PascalCase e o de destino em minúsculas. Alguém me pode indicar o que estou a fazer mal? CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text) RETURNS text AS $BODY$ DECLARE row record; BEGIN FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from LOOP EXECUTE 'ALTER TABLE ' || sch_from || '.' || quote_ident(row.tablename) || ' SET SCHEMA ' || sch_to || ';'; END LOOP; RETURN 'Tables were moved'; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION sys_move_tables(text, text) OWNER TO postgres; SELECT sys_move_tables('OrigEm', 'destino'); Obrigado. Cumprimentos, Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] ajuda com função
2013/12/18 Eloi e...@openmailbox.org Ola a toda a lista, Estou a tentar fazer funcionar a seguinte função para mover todas as tabelas de um esquema para outro. Não obtenho nenhum erro mas no entanto nada é movido. Peculiaridades: o nome do esquema de origem está em PascalCase e o de destino em minúsculas. Alguém me pode indicar o que estou a fazer mal? CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text) RETURNS text AS $BODY$ DECLARE row record; BEGIN FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from LOOP EXECUTE 'ALTER TABLE ' || sch_from || '.' || quote_ident(row.tablename) || ' SET SCHEMA ' || sch_to || ';'; END LOOP; RETURN 'Tables were moved'; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION sys_move_tables(text, text) OWNER TO postgres; SELECT sys_move_tables('OrigEm', 'destino'); Obrigado. Cumprimentos, Simples. Sua função não executa nada por causa da seguinte consulta: SELECT tablename FROM pg_tables WHERE schemaname = sch_from; Veja que você passou 'OrigEm' para sch_from, logo essa consulta ficaria: SELECT tablename FROM pg_tables WHERE schemaname = 'OrigEm'; Mas nas tabelas de catálogo, os nomes são armazenados diretamente, sem aspas duplas, logo sua consulta não traz nenhum registros e o loop não é executado. A solução é não passar com aspas duplas na chamada da função e tratar dentro da mesma: CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text) RETURNS text AS $BODY$ DECLARE row record; BEGIN FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from LOOP EXECUTE 'ALTER TABLE ' || quote_ident(sch_from) || '.' || quote_ident(row.tablename) || ' SET SCHEMA ' || quote_ident(sch_to) || ';'; END LOOP; RETURN 'Tables were moved'; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; SELECT sys_move_tables('OrigEm', 'destino'); Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres ___ 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 e...@openmailbox.org Ola a toda a lista, Estou a tentar fazer funcionar a seguinte função para mover todas as tabelas de um esquema para outro. Não obtenho nenhum erro mas no entanto nada é movido. Peculiaridades: o nome do esquema de origem está em PascalCase e o de destino em minúsculas. Alguém me pode indicar o que estou a fazer mal? CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text) RETURNS text AS $BODY$ DECLARE row record; BEGIN FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from LOOP EXECUTE 'ALTER TABLE ' || sch_from || '.' || quote_ident(row.tablename) || ' SET SCHEMA ' || sch_to || ';'; END LOOP; RETURN 'Tables were moved'; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION sys_move_tables(text, text) OWNER TO postgres; SELECT sys_move_tables('OrigEm', 'destino'); Obrigado. Cumprimentos, Simples. Sua função não executa nada por causa da seguinte consulta: SELECT tablename FROM pg_tables WHERE schemaname = sch_from; Veja que você passou 'OrigEm' para sch_from, logo essa consulta ficaria: SELECT tablename FROM pg_tables WHERE schemaname = 'OrigEm'; Mas nas tabelas de catálogo, os nomes são armazenados diretamente, sem aspas duplas, logo sua consulta não traz nenhum registros e o loop não é executado. A solução é não passar com aspas duplas na chamada da função e tratar dentro da mesma: CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text) RETURNS text AS $BODY$ DECLARE row record; BEGIN FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from LOOP EXECUTE 'ALTER TABLE ' || quote_ident(sch_from) || '.' || quote_ident(row.tablename) || ' SET SCHEMA ' || quote_ident(sch_to) || ';'; END LOOP; RETURN 'Tables were moved'; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; SELECT sys_move_tables('OrigEm', 'destino'); Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres [1] Certo, já funciona. Obrigado pela ajuda! Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] ajuda com função
2013/12/18 Eloi Ribeiro e...@openmailbox.org: On 2013-12-18 15:23, Matheus de Oliveira wrote: www.dextra.com.br/postgres [1] Certo, já funciona. Sim, a Dextra funciona, e o PostgreSQL também. Brincadeirinha… mas como você não cortou nem sequer a assinatura da mensagem a que respondeu, foi como o gMail me mostrou tua resposta. Além de evitar o /top posting/, outro ponto da netiqueta — não lembro se chega a estar na RFC 1855 — é cortar da mensagem respondida tudo a que não se está respondendo diretamente, a menos que seja importante para contextualizar. E evita esses efeitos colaterais engraçados. ___ 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 18-12-13 18:51, Guimarães Faria Corcete DUTRA, Leandro wrote: 2013/12/18 Eloi Ribeiro e...@openmailbox.org: On 2013-12-18 15:23, Matheus de Oliveira wrote: www.dextra.com.br/postgres [1] Certo, já funciona. Sim, a Dextra funciona, e o PostgreSQL também. Brincadeirinha… mas como você não cortou nem sequer a assinatura da mensagem a que respondeu, foi como o gMail me mostrou tua resposta. Além de evitar o /top posting/, outro ponto da netiqueta — não lembro se chega a estar na RFC 1855 — é cortar da mensagem respondida tudo a que não se está respondendo diretamente, a menos que seja importante para contextualizar. E evita esses efeitos colaterais engraçados. Estava eu a pensar por onde cortar quando respondi mas não sabia por onde e decidi não cortar. Não conhecia esse critério, terei em conta na próxima vez. Sim, esta na 'RFC 1855' (também ignorava): 'When replying to a message, include enough original material to be understood but no more.' Sempre aprender :-) ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Ajuda com função
Salve, pessoal. Estou precisando desenvolver uma função para retornar saldo e comecei desta maneira, mas não retorna dados: Criei um type: CREATE TYPE saldo_caixa AS ( debito numeric(18,2) ); A função: CREATE OR REPLACE FUNCTION saldocaixa() RETURNS SETOF saldo_caixa AS $body$ DECLARE debito_atual NUMERIC(18,2); linha saldo_caixa; begin SELECT INTO debito_atual SUM(value_cash) FROM cashes WHERE (type_cash= 'D'); linha.debito = debito_atual; RETURN; END $body$ LANGUAGE 'plpgsql'; Aí para usar: select * from saldocaixa(). No entanto, não retorna valor algum. Onde estou errando? []'s Stclara. ___ 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
Em 18 de setembro de 2012 15:26, Stclara stcl...@gmail.com escreveu: A função: CREATE OR REPLACE FUNCTION saldocaixa() RETURNS SETOF saldo_caixa AS $body$ DECLARE debito_atual NUMERIC(18,2); linha saldo_caixa; begin SELECT INTO debito_atual SUM(value_cash) FROM cashes WHERE (type_cash= 'D'); linha.debito = debito_atual; RETURN; END $body$ LANGUAGE 'plpgsql'; Aí para usar: select * from saldocaixa(). No entanto, não retorna valor algum. Onde estou errando? Pude identificar duas razões para o retorno vazio: I - Verifique se na tabela cashes a coluna type_cash possui valores iguais a 'D (creio que sim); II - Para que uma função que retorna set of funcione adequadamente você tem que usar return next para cada registro retornado e return no final [1]. III - Levando em conta que sua função retornará mais de um registro é bom você dar uma olhada no for select loop [1] e [2]. [1] - http://www.postgresql.org/docs/9.2/static/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING [2] - http://www.postgresql.org/docs/9.2/static/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING -- Marcone Peres - DBA http://www.linkedin.com/in/marconeperes @marconeperes (61) 8146-0028 ___ 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
Em 18/09/2012 15:26, Stclara escreveu: Salve, pessoal. Estou precisando desenvolver uma função para retornar saldo e comecei desta maneira, mas não retorna dados: Criei um type: CREATE TYPE saldo_caixa AS ( debito numeric(18,2) ); A função: CREATE OR REPLACE FUNCTION saldocaixa() RETURNS SETOF saldo_caixa AS $body$ DECLARE debito_atual NUMERIC(18,2); linha saldo_caixa; begin SELECT INTO debito_atual SUM(value_cash) FROM cashes WHERE (type_cash= 'D'); linha.debito = debito_atual; RETURN; END $body$ LANGUAGE 'plpgsql'; uma outra possibilidade: CREATE OR REPLACE FUNCTION saldocaixa() RETURNS SETOF saldo_caixa AS $body$ DECLARE debito_atual NUMERIC(18,2); linha saldo_caixa; begin RETURN Query SELECT SUM(value_cash)::NUMERIC(18,2) FROM cashes WHERE (type_cash= 'D'); END $body$ LANGUAGE 'plpgsql'; -- Irineu Raymundo Programador/Consultor Técnico Senda Engenharia de Dados Ltda. ___ 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 - Resolvido
Salve, senhores. Ficou assim: CREATE TYPE saldo_caixa AS ( saldo_anterior numeric(18,2), debito numeric(18,2), credito numeric(18,2), saldo numeric(18,2), inicio date, fim date ); CREATE OR REPLACE FUNCTION saldocaixa(date, date) RETURNS SETOF saldo_caixa AS $body$ DECLARE debito_ant NUMERIC(18,2); credito_ant NUMERIC(18,2); debito_atual NUMERIC(18,2); credito_atual NUMERIC(18,2); linha saldo_caixa; begin linha.saldo_anterior := 0; linha.debito := 0; linha.credito := 0; linha.saldo := 0; SELECT INTO debito_atual SUM(value_cash) FROM cashes WHERE (type_cash= 'D' and date_cash between $1 and $2); SELECT INTO credito_atual SUM(value_cash) FROM cashes WHERE (type_cash= 'C' and date_cash between $1 and $2); SELECT INTO credito_ant SUM(value_cash) FROM cashes WHERE (type_cash= 'C' and date_cash $1 ); SELECT INTO debito_ant SUM(value_cash) FROM cashes WHERE (type_cash= 'D' and date_cash $1 ); if credito_atual is null then credito_atual = 0; end if; if debito_atual is null then debito_atual = 0; end if; if credito_ant is null then credito_ant = 0; end if; if debito_ant is null then debito_ant = 0; end if; linha.saldo_anterior = (credito_ant - debito_ant); linha.debito = debito_atual; linha.credito = credito_atual; linha.saldo = linha.saldo_anterior - (credito_atual - debito_atual); linha.inicio = $1; linha.fim = $2; return next linha; RETURN; END $body$ LANGUAGE 'plpgsql'; Aí chamo: select * from saldocaixa('2012-09-18', '2012-09-18'). Estou utilizando com rails em um projeto: http://siga.herokuapp.com/. Breve coloco o código no github. Obrigado a todos. []'s Stclara. Em 18-09-2012 17:06, Irineu escreveu: Em 18/09/2012 15:26, Stclara escreveu: Salve, pessoal. Estou precisando desenvolver uma função para retornar saldo e comecei desta maneira, mas não retorna dados: Criei um type: CREATE TYPE saldo_caixa AS ( debito numeric(18,2) ); A função: CREATE OR REPLACE FUNCTION saldocaixa() RETURNS SETOF saldo_caixa AS $body$ DECLARE debito_atual NUMERIC(18,2); linha saldo_caixa; begin SELECT INTO debito_atual SUM(value_cash) FROM cashes WHERE (type_cash= 'D'); linha.debito = debito_atual; RETURN; END $body$ LANGUAGE 'plpgsql'; uma outra possibilidade: CREATE OR REPLACE FUNCTION saldocaixa() RETURNS SETOF saldo_caixa AS $body$ DECLARE debito_atual NUMERIC(18,2); linha saldo_caixa; begin RETURN Query SELECT SUM(value_cash)::NUMERIC(18,2) FROM cashes WHERE (type_cash= 'D'); END $body$ LANGUAGE 'plpgsql'; ___ 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
Obrigado a todos pelas vossas dicas. Fiz isso, retirei a parte de criação de colunas da função e agora não salta nenhum erro. No entanto seria de esperar que quando um polígono fosse editado o campo área fosse actualizado e isso não acontece. Alguém me sabe dizer o que é que está mal? CREATE OR REPLACE FUNCTION fun_dimensoes() RETURNS trigger AS $BODY$ DECLARE tipovarchar(20); sridinteger; BEGIN tipo :=(SELECT type FROM geometry_columns WHERE f_table_schema = TG_TABLE_SCHEMA AND f_table_name = TG_TABLE_NAME); srid :=(SELECT srid FROM geometry_columns WHERE f_table_schema = TG_TABLE_SCHEMA AND f_table_name = TG_TABLE_NAME); -- ponto IF (tipo = 'POINT' OR tipo = 'MULTIPOINT') THEN NEW.x = ST_X(NEW.geom); NEW.y = ST_Y(NEW.geom); -- linha ELSIF (tipo = 'LINESTRING' OR tipo = 'MULTILINESTRING') THEN IF (srid = 23030 OR srid = 25830) THEN NEW.longitude = ST_Length(NEW.geom)::bigint; ELSIF (srid = 4326) THEN NEW.longitude = ST_Length(Geography(NEW.geom))::bigint; END IF; -- poligono ELSIF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN IF (srid = 23030 OR srid = 25830) THEN NEW.area = ST_Area(NEW.geom)::bigint; NEW.perimetro = ST_Perimeter(NEW.geom)::bigint; ELSIF (srid = 4326) THEN NEW.area = ST_Area(Geography(NEW.geom))::bigint; NEW.perimetro = ST_Length(Geography(NEW.geom))::bigint; END IF; END IF; RETURN NEW; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; Obrigado, Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 17 de Março de 2012 21:39, Matheus de Oliveira matioli.math...@gmail.com escreveu: Se você passar a trigger para AFTER ao invés de BEFORE suas chances de não ter lock aumentam, mas não desaparecem. Analisando por cima suas necessidades, não acredito que a melhor solução seja realmente adicionar uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou seja, sempre adicione a coluna (talvez junto com a execução do comando CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode até fazer a verificação e dar um RAISE EXCEPTION caso não exista). PS: Caso a trigger seja genérica para várias tabelas, você pode pensar em usar herança nessas tabelas para organizar melhor as coisas. Atenciosamente, -- Matheus de Oliveira Bacharelado em Ciências de Computação Laboratório de Computação de Alto Desempenho - LCADhttp://www.lcad.icmc.usp.br/ Instituto de Ciências Matemáticas e de Computação - ICMChttp://www.icmc.usp.br/ Universidade de São Paulo - USP http://www.sc.usp.br/ On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote: O melhor será separar esta função em duas: A primeira que verifique se os campos existem e se não os criam. E a segunda como disparador para que se actualizem com os inserts e updates. Obrigado pela ajuda! Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel fha...@gmail.com escreveu: Cancelando as demais transações/conexões também resolve seu problema *se, e somente se* isto não for um problema no seu cenário. Minha experiência com DDL dentro de funções é de resultado sempre inesperado. Se a função é específica para ser executada em horário controlado, geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor executando funções do que comandos mais complexos ou scripts. Já se a função é para ser chamada automaticamente por causa de uma necessidade de uma aplicação ou usuário, a chance de lock é monstruosa, e é o que está ocorrendo com o colega. []s Flavio Gurgel ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função
A trigger é BEFORE? Caso contrário não atualiza mesmo. -- Matheus de Oliveira Bacharelado em Ciências de Computação Laboratório de Computação de Alto Desempenho - LCADhttp://www.lcad.icmc.usp.br/ Instituto de Ciências Matemáticas e de Computação - ICMChttp://www.icmc.usp.br/ Universidade de São Paulo - USP http://www.sc.usp.br/ On Tue, Mar 20, 2012 at 10:57 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote: Obrigado a todos pelas vossas dicas. Fiz isso, retirei a parte de criação de colunas da função e agora não salta nenhum erro. No entanto seria de esperar que quando um polígono fosse editado o campo área fosse actualizado e isso não acontece. Alguém me sabe dizer o que é que está mal? CREATE OR REPLACE FUNCTION fun_dimensoes() RETURNS trigger AS $BODY$ DECLARE tipovarchar(20); sridinteger; BEGIN tipo :=(SELECT type FROM geometry_columns WHERE f_table_schema = TG_TABLE_SCHEMA AND f_table_name = TG_TABLE_NAME); srid :=(SELECT srid FROM geometry_columns WHERE f_table_schema = TG_TABLE_SCHEMA AND f_table_name = TG_TABLE_NAME); -- ponto IF (tipo = 'POINT' OR tipo = 'MULTIPOINT') THEN NEW.x = ST_X(NEW.geom); NEW.y = ST_Y(NEW.geom); -- linha ELSIF (tipo = 'LINESTRING' OR tipo = 'MULTILINESTRING') THEN IF (srid = 23030 OR srid = 25830) THEN NEW.longitude = ST_Length(NEW.geom)::bigint; ELSIF (srid = 4326) THEN NEW.longitude = ST_Length(Geography(NEW.geom))::bigint; END IF; -- poligono ELSIF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN IF (srid = 23030 OR srid = 25830) THEN NEW.area = ST_Area(NEW.geom)::bigint; NEW.perimetro = ST_Perimeter(NEW.geom)::bigint; ELSIF (srid = 4326) THEN NEW.area = ST_Area(Geography(NEW.geom))::bigint; NEW.perimetro = ST_Length(Geography(NEW.geom))::bigint; END IF; END IF; RETURN NEW; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; Obrigado, Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 17 de Março de 2012 21:39, Matheus de Oliveira matioli.math...@gmail.com escreveu: Se você passar a trigger para AFTER ao invés de BEFORE suas chances de não ter lock aumentam, mas não desaparecem. Analisando por cima suas necessidades, não acredito que a melhor solução seja realmente adicionar uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou seja, sempre adicione a coluna (talvez junto com a execução do comando CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode até fazer a verificação e dar um RAISE EXCEPTION caso não exista). PS: Caso a trigger seja genérica para várias tabelas, você pode pensar em usar herança nessas tabelas para organizar melhor as coisas. Atenciosamente, -- Matheus de Oliveira Bacharelado em Ciências de Computação Laboratório de Computação de Alto Desempenho - LCADhttp://www.lcad.icmc.usp.br/ Instituto de Ciências Matemáticas e de Computação - ICMChttp://www.icmc.usp.br/ Universidade de São Paulo - USP http://www.sc.usp.br/ On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote: O melhor será separar esta função em duas: A primeira que verifique se os campos existem e se não os criam. E a segunda como disparador para que se actualizem com os inserts e updates. Obrigado pela ajuda! Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel fha...@gmail.com escreveu: Cancelando as demais transações/conexões também resolve seu problema *se, e somente se* isto não for um problema no seu cenário. Minha experiência com DDL dentro de funções é de resultado sempre inesperado. Se a função é específica para ser executada em horário controlado, geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor executando funções do que comandos mais complexos ou scripts. Já se a função é para ser chamada automaticamente por causa de uma necessidade de uma aplicação ou usuário, a chance de lock é monstruosa, e é o que está ocorrendo com o colega. []s Flavio Gurgel ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://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
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 - LCADhttp://www.lcad.icmc.usp.br/ Instituto de Ciências Matemáticas e de Computação - ICMChttp://www.icmc.usp.br/ Universidade de São Paulo - USP http://www.sc.usp.br/ On Tue, Mar 20, 2012 at 10:57 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote: Obrigado a todos pelas vossas dicas. Fiz isso, retirei a parte de criação de colunas da função e agora não salta nenhum erro. No entanto seria de esperar que quando um polígono fosse editado o campo área fosse actualizado e isso não acontece. Alguém me sabe dizer o que é que está mal? CREATE OR REPLACE FUNCTION fun_dimensoes() RETURNS trigger AS $BODY$ DECLARE tipovarchar(20); sridinteger; BEGIN tipo :=(SELECT type FROM geometry_columns WHERE f_table_schema = TG_TABLE_SCHEMA AND f_table_name = TG_TABLE_NAME); srid :=(SELECT srid FROM geometry_columns WHERE f_table_schema = TG_TABLE_SCHEMA AND f_table_name = TG_TABLE_NAME); -- ponto IF (tipo = 'POINT' OR tipo = 'MULTIPOINT') THEN NEW.x = ST_X(NEW.geom); NEW.y = ST_Y(NEW.geom); -- linha ELSIF (tipo = 'LINESTRING' OR tipo = 'MULTILINESTRING') THEN IF (srid = 23030 OR srid = 25830) THEN NEW.longitude = ST_Length(NEW.geom)::bigint; ELSIF (srid = 4326) THEN NEW.longitude = ST_Length(Geography(NEW.geom))::bigint; END IF; -- poligono ELSIF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN IF (srid = 23030 OR srid = 25830) THEN NEW.area = ST_Area(NEW.geom)::bigint; NEW.perimetro = ST_Perimeter(NEW.geom)::bigint; ELSIF (srid = 4326) THEN NEW.area = ST_Area(Geography(NEW.geom))::bigint; NEW.perimetro = ST_Length(Geography(NEW.geom))::bigint; END IF; END IF; RETURN NEW; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; Obrigado, Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 17 de Março de 2012 21:39, Matheus de Oliveira matioli.math...@gmail.com escreveu: Se você passar a trigger para AFTER ao invés de BEFORE suas chances de não ter lock aumentam, mas não desaparecem. Analisando por cima suas necessidades, não acredito que a melhor solução seja realmente adicionar uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou seja, sempre adicione a coluna (talvez junto com a execução do comando CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode até fazer a verificação e dar um RAISE EXCEPTION caso não exista). PS: Caso a trigger seja genérica para várias tabelas, você pode pensar em usar herança nessas tabelas para organizar melhor as coisas. Atenciosamente, -- Matheus de Oliveira Bacharelado em Ciências de Computação Laboratório de Computação de Alto Desempenho - LCADhttp://www.lcad.icmc.usp.br/ Instituto de Ciências Matemáticas e de Computação - ICMChttp://www.icmc.usp.br/ Universidade de São Paulo - USP http://www.sc.usp.br/ On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote: O melhor será separar esta função em duas: A primeira que verifique se os campos existem e se não os criam. E a segunda como disparador para que se actualizem com os inserts e updates. Obrigado pela ajuda! Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel fha...@gmail.com escreveu: Cancelando as demais transações/conexões também resolve seu problema *se, e somente se* isto não for um problema no seu cenário. Minha experiência com DDL dentro de funções é de resultado sempre inesperado. Se a função é específica para ser executada em horário controlado, geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor executando funções do que comandos mais complexos ou scripts. Já se a função é para ser chamada automaticamente por causa de uma necessidade de uma aplicação ou usuário, a chance de lock é monstruosa, e é o que está ocorrendo com o colega. []s Flavio Gurgel ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br
Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função
Se você passar a trigger para AFTER ao invés de BEFORE suas chances de não ter lock aumentam, mas não desaparecem. Analisando por cima suas necessidades, não acredito que a melhor solução seja realmente adicionar uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou seja, sempre adicione a coluna (talvez junto com a execução do comando CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode até fazer a verificação e dar um RAISE EXCEPTION caso não exista). PS: Caso a trigger seja genérica para várias tabelas, você pode pensar em usar herança nessas tabelas para organizar melhor as coisas. Atenciosamente, -- Matheus de Oliveira Bacharelado em Ciências de Computação Laboratório de Computação de Alto Desempenho - LCADhttp://www.lcad.icmc.usp.br/ Instituto de Ciências Matemáticas e de Computação - ICMChttp://www.icmc.usp.br/ Universidade de São Paulo - USP http://www.sc.usp.br/ On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote: O melhor será separar esta função em duas: A primeira que verifique se os campos existem e se não os criam. E a segunda como disparador para que se actualizem com os inserts e updates. Obrigado pela ajuda! Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel fha...@gmail.com escreveu: Cancelando as demais transações/conexões também resolve seu problema *se, e somente se* isto não for um problema no seu cenário. Minha experiência com DDL dentro de funções é de resultado sempre inesperado. Se a função é específica para ser executada em horário controlado, geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor executando funções do que comandos mais complexos ou scripts. Já se a função é para ser chamada automaticamente por causa de uma necessidade de uma aplicação ou usuário, a chance de lock é monstruosa, e é o que está ocorrendo com o colega. []s Flavio Gurgel ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função
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
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 adam...@gmail.com escreveu: Em 12 de março de 2012 07:11, Eloi Ribeiro eloi.ribe...@gmail.com escreveu: Ola a todos, Estou a fazer a seguinte função para que me actualize o campo 'area' cada vez que exista um INSERT ou UPDATE numa tabela. O problema está que o campo 'area' pode não existir e gostava que nesse caso o campo seja criado e preenchido para todos os registos. Como tenho salta-me o erro de que 'Nao existe o esquema «tg_table_schema»' e não encontro maneira de resolver isso. Como faço para adicionar um campo à tabela onde dispara a função e se preencha esse campo? Se bem entendi, queres adicionar uma coluna à tabela quando ela não existir. Já tentou mudar o seu ALTER TABLE explícito por: EXECUTE IMMEDIATE 'ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD COLUMN area bigint'; ? -- TIAGO J. ADAMI http://www.adamiworks.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função
Em 15 de março de 2012 07:19, Eloi Ribeiro eloi.ribe...@gmail.com escreveu: ERROR: no se puede hacer ALTER TABLE en «postfire_study_area» porque está siendo usada por consultas activas en esta sesión A mensagem é clara: não se pode fazer um ALTER TABLE sobre uma tabela que está sendo utilizada. Para que o seu ALTER TABLE funcione é necessário encerrar com COMMIT ou ROLLBACK toda e qualquer transação/conexão que esteja utilizando esta tabela - exceto a transação/conexão que irá realizar efetivamente o ALTER TABLE. 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. -- 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] 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] Ajuda com função - adicionar campo dentro de uma função
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» O erro é claro (embora em espanhol, língua que não domino): Não existe o esquema tg_table_schema. Existe um esquema com esse nome? A tabela está dentro do esquema certo? []s Flavio Gurgel ___ 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
Em 12 de março de 2012 07:11, Eloi Ribeiro eloi.ribe...@gmail.com escreveu: Ola a todos, Estou a fazer a seguinte função para que me actualize o campo 'area' cada vez que exista um INSERT ou UPDATE numa tabela. O problema está que o campo 'area' pode não existir e gostava que nesse caso o campo seja criado e preenchido para todos os registos. Como tenho salta-me o erro de que 'Nao existe o esquema «tg_table_schema»' e não encontro maneira de resolver isso. Como faço para adicionar um campo à tabela onde dispara a função e se preencha esse campo? Se bem entendi, queres adicionar uma coluna à tabela quando ela não existir. Já tentou mudar o seu ALTER TABLE explícito por: EXECUTE IMMEDIATE 'ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD COLUMN area bigint'; ? -- TIAGO J. ADAMI http://www.adamiworks.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
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
Re: [pgbr-geral] AJUDA COM FUNÇÃO
Olá Jose, Fuçando um pouco fora da limitada documentação do PostgreSQL, em versões anteriores à 8.4, pode-se converter o tipo ctid para um tipo utilizável através da função tidout() e mais algumas gambiarras. O código-raimunda equivalente ao que passei, que assim codificado funciona em versões anteriores do PostgreSQL fica: select * from SUATABELA where ( cast( substring( encode(cstring_send(tidout(ctid)),'escape'), 2, position(',' in rtrim( encode(cstring_send(tidout(ctid)),'escape') ))-2 ) as int) * 199+ cast( substring( encode(cstring_send(tidout(ctid)),'escape'), position(',' in encode(cstring_send(tidout(ctid)),'escape'))+1, length(rtrim(encode(cstring_send(tidout(ctid)),'escape'))) - position(',' in encode(cstring_send(tidout(ctid)),'escape'))-1 ) as int) ) % 10=1 Atenciosamente, Mozart Hasse ___ 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
Bom dia ! Estou retomando este trabalho e tenho algumas dúvidas. Obrigado. 1) Tentei executar o insert as select que voce me passou e está dando o seguinte erro: cdrger=# \i insert.sql psql:insert.sql:18: ERRO: não pode converter tipo tid para character varying O que significa o ctid ? Será que é isso que ele está reclamando ? Estou executando isso: insert into TESTE select * from cdrger20090319 where ( cast( substring( cast(ctid as varchar(20)), 2, position(',' in cast(ctid as varchar(20)))-2 ) as int) * 199+ cast( substring( cast(ctid as varchar(20)), position(',' in cast(ctid as varchar(20)))+1, length(rtrim(cast(ctid as varchar(20 - position(',' in cast(ctid as varchar(20)))-1 ) as int) ) % 10=1 2) Como eu faria um loop para fazer esse insert para cada uma das tabelas cdrger* da minha base ? Por exemplo, na base que estou testando tenho as tabelas abaixo. Quando for executar o script numa base qualquer poderei ter n tabelas do tipo cdger*. O objetivo é gerar um dump ou algo do tipo com 10% dos dados (ou x%) para cada uma das tabelas e depois tenho que importar essas tabelas reduzidas numa base que estará em um notebook da área comercial e estas devem ter o mesmo nome das tabelas de origem. cdrger=# \dt Lista de relações Esquema | Nome | Tipo | Dono -+++-- public | cdrger20090220 | tabela | postgres public | cdrger20090228 | tabela | postgres public | cdrger20090301 | tabela | postgres public | cdrger20090303 | tabela | postgres public | cdrger20090305 | tabela | postgres public | cdrger20090311 | tabela | postgres public | cdrger20090312 | tabela | postgres public | cdrger20090313 | tabela | postgres public | cdrger20090314 | tabela | postgres public | cdrger20090315 | tabela | postgres public | cdrger20090316 | tabela | postgres public | cdrger20090317 | tabela | postgres public | cdrger20090318 | tabela | postgres public | cdrger20090319 | tabela | postgres public | cdrger20090320 | tabela | postgres public | teste | tabela | postgres (16 registros) Em 23 de março de 2010 14:25, pgbr-geral-requ...@listas.postgresql.org.brescreveu: Send pgbr-geral mailing list submissions to pgbr-geral@listas.postgresql.org.br To subscribe or unsubscribe via the World Wide Web, visit https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral or, via email, send a message with subject or body 'help' to pgbr-geral-requ...@listas.postgresql.org.br You can reach the person managing the list at pgbr-geral-ow...@listas.postgresql.org.br When replying, please edit your Subject line so it is more specific than Re: Contents of pgbr-geral digest... Tópicos de Hoje: 1. Re: Tutoriais para aprender a fazer queries usandoLatitudes e Longitudes? (George Silva) 2. Re: Tutoriais para aprender a fazer queries usandoLatitudes e Longitudes? (Andre Lopes) 3. Re: AJUDA COM FUNÇÃO (Mozart Hasse) 4. Re: Como configurar e conectar o PHPpgAdmin? (JotaComm) 5. Re: Raid 10 (JotaComm) 6. Re: AJUDA COM FUNÇÃO (pgplsql) (JotaComm) -- Mensagem encaminhada -- From: Mozart Hasse mozart.ha...@usa.net To: pgbr-geral@listas.postgresql.org.br Date: Tue, 23 Mar 2010 13:19:20 -0300 Subject: Re: [pgbr-geral] AJUDA COM FUNÇÃO Oi Jose, Para pegar aproximadamente 1 de cada 10 registros da sua tabela, faça o seguinte: --insert into ONDEVOCEQUISER select * from SUATABELA where ( cast( substring( cast(ctid as varchar(20)), 2, position(',' in cast(ctid as varchar(20)))-2 ) as int) * 199+ cast( substring( cast(ctid as varchar(20)), position(',' in cast(ctid as varchar(20)))+1, length(rtrim(cast(ctid as varchar(20 - position(',' in cast(ctid as varchar(20)))-1 ) as int) ) % 10=1 Troque o 10 da última linha pela taxa de amostragem que te convier. (Sim, eu também sinto uma falta desgraçada do rowid do Oracle) Devido ao tamanho dos registros influenciarem na distribuição dos ctids, você pode não ter *exatamente* 10% dos registros no caso acima (apesar de eu duvidar que a margem de erro tire teu sono). Isso pode ser minimizado rodando um vacuum full antes da exportação ou escolhendo outro primo no lugar do 199 que seja mais próximo do número de registros por bloco da tabela desejada. Atenciosamente, Mozart Hasse -- Mensagem encaminhada -- From: JotaComm jota.c...@gmail.com To: Comunidade PostgreSQL Brasileira pgbr-geral@listas.postgresql.org.br Date: Tue, 23 Mar 2010 14:08:16 -0300 Subject: Re: [pgbr-geral] AJUDA COM FUNÇÃO (pgplsql) Olá, Em 23 de março de 2010 11:28, Jose Luis Ramos
Re: [pgbr-geral] AJUDA COM FUNÇÃO
Olá Jose, Bom dia ! Estou retomando este trabalho e tenho algumas dúvidas. Obrigado. 1) Tentei executar o insert as select que voce me passou e está dando o seguinte erro: cdrger=# \i insert.sql psql:insert.sql:18: ERRO: não pode converter tipo tid para character varying Puuutz, de fato, não funciona em versões anteriores do PostgreSQL. Eu te passei o que funcionou na 8.4.3, não sei a partir de que versão foi colocado esse CAST. Não tenho sugestão de jeito fácil de fazer isso em versões anteriores. O que significa o ctid ? Será que é isso que ele está reclamando ? Estou executando isso: ctid é um identificador único do registro dentro da tabela, composto por 2 números. O que o fragmento que passei faz é transformar os dois num número único e tirar o resto da divisão para ter uma distribuição meio aleatória. Atenciosamente, Mozart Hasse ___ 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
Em 6 de abril de 2010 13:41, Mozart Hasse mozart.ha...@usa.net escreveu: Olá Jose, Bom dia ! Estou retomando este trabalho e tenho algumas dúvidas. Obrigado. 1) Tentei executar o insert as select que voce me passou e está dando o seguinte erro: cdrger=# \i insert.sql psql:insert.sql:18: ERRO: não pode converter tipo tid para character varying Puuutz, de fato, não funciona em versões anteriores do PostgreSQL. Eu te passei o que funcionou na 8.4.3, não sei a partir de que versão foi colocado esse CAST. Não tenho sugestão de jeito fácil de fazer isso em versões anteriores. O que significa o ctid ? Será que é isso que ele está reclamando ? Estou executando isso: ctid é um identificador único do registro dentro da tabela, composto por 2 números. O que o fragmento que passei faz é transformar os dois num número único e tirar o resto da divisão para ter uma distribuição meio aleatória. Verifique se funciona: bdteste=# SELECT ctid, (substring(ctid::text, 2, position(',' in ctid::text)-2 )::int) * 199 + (substring(ctid::text, position(',' in ctid::text)+1, length(rtrim(ctid::text)) - position(',' in ctid::text)-1 )::int) FROM foo; ctid | ?column? ---+-- (0,1) |1 (0,2) |2 (0,3) |3 (0,4) |4 (4 registros) Osvaldo ___ 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 (pgplsql)
Gostaria de uma ajuda no seguinte: tenho várias tabelas com o mesmo prefixo: cdrger=# \dt Lista de relações Esquema | Nome | Tipo | Dono -+++-- public | cdrger20090227 | tabela | postgres public | cdrger20090306 | tabela | postgres public | cdrger20090311 | tabela | postgres public | cdrger20090319 | tabela | postgres public | cdrger20090320 | tabela | postgres public | cdrger20090324 | tabela | postgres public | cdrger20090325 | tabela | postgres public | cdrger20090326 | tabela | postgres public | cdrger20090327 | tabela | postgres public | cdrger20090328 | tabela | postgres public | cdrger20090329 | tabela | postgres public | cdrger20090330 | tabela | postgres (12 registros) Preciso fazer uma funçaõ que, para cada tabela do banco com esse prefixo (cdrger*), eu leia um registro, grave de alguma forma (por exemplo em uma tab temp), pulo x registros, gravo o próximo, pulo mais x registros, e assim por diante. O objetivo é gerar uma base menor que a base que estou lendo. Depois tenho que exportar essa ou essas tabelas temp geradas e importar em uma base de um notebook para ser utilizada pela área comercial da empresa. Se alguém puder me ajudar eu agradeço. Conheço Oracle, mas estou começando com PostgreSQL esta semana ... Obrigado. -- Jose Luis Ramos Jr Campinas - SP Oracle OCP DBA 8i, 9i,10g Fone: 19-37056793 ___ 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
Oi Jose, Para pegar aproximadamente 1 de cada 10 registros da sua tabela, faça o seguinte: --insert into ONDEVOCEQUISER select * from SUATABELA where ( cast( substring( cast(ctid as varchar(20)), 2, position(',' in cast(ctid as varchar(20)))-2 ) as int) * 199+ cast( substring( cast(ctid as varchar(20)), position(',' in cast(ctid as varchar(20)))+1, length(rtrim(cast(ctid as varchar(20 - position(',' in cast(ctid as varchar(20)))-1 ) as int) ) % 10=1 Troque o 10 da última linha pela taxa de amostragem que te convier. (Sim, eu também sinto uma falta desgraçada do rowid do Oracle) Devido ao tamanho dos registros influenciarem na distribuição dos ctids, você pode não ter *exatamente* 10% dos registros no caso acima (apesar de eu duvidar que a margem de erro tire teu sono). Isso pode ser minimizado rodando um vacuum full antes da exportação ou escolhendo outro primo no lugar do 199 que seja mais próximo do número de registros por bloco da tabela desejada. Atenciosamente, Mozart Hasse From: Jose Luis Ramos jose.ramos.caj...@gmail.com Preciso fazer uma funçaõ que, para cada tabela do banco com esse prefixo (cdrger*), eu leia um registro, grave de alguma forma (por exemplo em uma tab temp), pulo x registros, gravo o próximo, pulo mais x registros, e assim por diante. O objetivo é gerar uma base menor que a base que estou lendo. ___ 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 (pgplsql)
Olá, Em 23 de março de 2010 11:28, Jose Luis Ramos jose.ramos.caj...@gmail.comescreveu: Gostaria de uma ajuda no seguinte: tenho várias tabelas com o mesmo prefixo: cdrger=# \dt Lista de relações Esquema | Nome | Tipo | Dono -+++-- public | cdrger20090227 | tabela | postgres public | cdrger20090306 | tabela | postgres public | cdrger20090311 | tabela | postgres public | cdrger20090319 | tabela | postgres public | cdrger20090320 | tabela | postgres public | cdrger20090324 | tabela | postgres public | cdrger20090325 | tabela | postgres public | cdrger20090326 | tabela | postgres public | cdrger20090327 | tabela | postgres public | cdrger20090328 | tabela | postgres public | cdrger20090329 | tabela | postgres public | cdrger20090330 | tabela | postgres (12 registros) Preciso fazer uma funçaõ que, para cada tabela do banco com esse prefixo (cdrger*), eu leia um registro, grave de alguma forma (por exemplo em uma tab temp), pulo x registros, gravo o próximo, pulo mais x registros, e assim por diante. O objetivo é gerar uma base menor que a base que estou lendo. Depois tenho que exportar essa ou essas tabelas temp geradas e importar em uma base de um notebook para ser utilizada pela área comercial da empresa. Se alguém puder me ajudar eu agradeço. Conheço Oracle, mas estou começando com PostgreSQL esta semana ... Obrigado. Fiquei confuso. Acho que um exemplo facilitaria o entendimento. -- Jose Luis Ramos Jr Campinas - SP Oracle OCP DBA 8i, 9i,10g Fone: 19-37056793 ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral []s -- JotaComm http://jotacomm.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 FUNÇÃO (pgplsql)
Em 23 de março de 2010 11:28, Jose Luis Ramos jose.ramos.caj...@gmail.com escreveu: Gostaria de uma ajuda no seguinte: tenho várias tabelas com o mesmo prefixo: cdrger=# \dt Lista de relações Esquema | Nome | Tipo | Dono -+++-- public | cdrger20090227 | tabela | postgres public | cdrger20090306 | tabela | postgres public | cdrger20090311 | tabela | postgres public | cdrger20090319 | tabela | postgres public | cdrger20090320 | tabela | postgres public | cdrger20090324 | tabela | postgres public | cdrger20090325 | tabela | postgres public | cdrger20090326 | tabela | postgres public | cdrger20090327 | tabela | postgres public | cdrger20090328 | tabela | postgres public | cdrger20090329 | tabela | postgres public | cdrger20090330 | tabela | postgres (12 registros) Preciso fazer uma funçaõ que, para cada tabela do banco com esse prefixo (cdrger*), eu leia um registro, grave de alguma forma (por exemplo em uma tab temp), pulo x registros, gravo o próximo, pulo mais x registros, e assim por diante. O objetivo é gerar uma base menor que a base que estou lendo. Depois tenho que exportar essa ou essas tabelas temp geradas e importar em uma base de um notebook para ser utilizada pela área comercial da empresa. Se alguém puder me ajudar eu agradeço. Conheço Oracle, mas estou começando com PostgreSQL esta semana ... Obrigado. Tente uma função do tipo: CREATE OR REPLACE FUNCTION sua_função(prefixo text) RETURNS void AS $$ DECLARE tabela text; novatabela text; n int; BEGIN FOR tabela IN EXECUTE 'SELECT table_name FROM information_schema.tables WHERE table_name LIKE ' || prefixo || '%' LOOP novatabela = 'novoprefixo' || substring(tabela,7); EXECUTE 'CREATE TABLE ' || novatabela || 'AS SELECT * FROM ' || tabela || ' WITH NO DATA'; EXECUTE 'SELECT count(*)/10 FROM ' || tabela INTO n; FOR i = 1 to n LOOP EXECUTE 'INSERT INTO ' || novatabela || ' SELECT * FROM ' || tabela || ' LIMIT 1 OFFSET ' || (i-1)*10::text; END LOOP; END LOOP; RETURN; END; $$ LANGUAGE plpgsql; Osvaldo PS.: Não testada ___ 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
Pessoal, Já dei uma olhada nas mensagens do fórum, sei que vi algo relativo a isto aqui. Preciso que o retorno de uma função retorne mais de um valor dentro de uma sql, tipo retorno multi-coluna. Já tentei vetores também, mas o retorno é uma estrutura textual dentro do campo. ex. select xy(); resultado coluna A | coluna B | d Eu tava 'nas idéia' com crosstab mas não é isso... a idade já não ajuda mais... não consigo me lembrar... Alguém recorda como fazer? Desde já agradeço -- - Rudinei Dias ___ 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
Eu faço isso com a function retornando um type... funciona direitinho...: CREATE TYPE typ_teste ( codigo integer, texto, text); CREATE FUNCTION fnc_teste() RETURNS setof typ_teste Acho que da pra fazer com out tb create function fnc_teste (out, out) 2009/7/9 Rudinei Dias rudinei.d...@gmail.com Pessoal, Já dei uma olhada nas mensagens do fórum, sei que vi algo relativo a isto aqui. Preciso que o retorno de uma função retorne mais de um valor dentro de uma sql, tipo retorno multi-coluna. Já tentei vetores também, mas o retorno é uma estrutura textual dentro do campo. ex. select xy(); resultado coluna A | coluna B | d Eu tava 'nas idéia' com crosstab mas não é isso... a idade já não ajuda mais... não consigo me lembrar... Alguém recorda como fazer? Desde já agradeço -- - Rudinei Dias ___ 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
Ola O que estou fazendo e saindo dele ( sqlrdd ) para trabalhar nativamente com o Postgres. nao precisa fazer isso o sqlrdd acessa o banco direto por queries tambem e nao precisa desse tipo de gambiarra para acessar os dados []s Luiz www.xharbour.com.br ___ 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
Ola tetraetila Vc esta utilizando o sqlrdd do xharbour.com correto. se sim nao e necessario fazer o que vc esta tentando o sqlrdd e bem inteligente quando a bloqueios de arquivos []s Luiz ___ 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
Vou verificar isto agora, muito obrigado novamente... Adilson - Original Message - From: Osvaldo Kussama [EMAIL PROTECTED] To: Comunidade PostgreSQL Brasileira pgbr-geral@listas.postgresql.org.br Sent: Saturday, November 01, 2008 6:23 PM Subject: Re: [pgbr-geral] Ajuda com função Adilson: Pelo visto você continua tentando trabalhar com bloqueios de registros. Já foi dito anteriormente, e vou insistir novamente: dê uma estudada na maneira como o PostgreSQL trabalha (particularmente MVCC [1]) pois é bem diferente da maneira com que um dbf trabalha. Osvaldo [1] http://pgdocptbr.sourceforge.net/pg80/mvcc.html#MVCC-INTRO ___ 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
Valeu Osvaldo, Muito obrigado, vou testar. Adilson ___ 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
- Original Message - From: Osvaldo Kussama [EMAIL PROTECTED] To: Comunidade PostgreSQL Brasileira pgbr-geral@listas.postgresql.org.br Sent: Friday, October 31, 2008 9:07 PM Subject: Re: [pgbr-geral] Ajuda com função select * FROM a003.a003015_tbl as a, pgrowlocks('a003.a003015_tbl') AS p WHERE p.locked_row = a.ctid order by sr_recno; Não deu para entender o que você quer fazer. Vejamos: - innermyst é uma string que contém o comando SQL que você desja executar. - myrec é um record contendo todos os campos resultantes da junção da - tabela $1 com a tabela pgrowlocks. - você concatena a string com o record (sinceramente não sei qual o resultado) e tenta executar? Osvaldo ___ Nem eu? : - ) Caro Osvaldo Ela precisa me retornar o resultado como se eu tivesse feito este select: select * FROM a003.a003015_tbl as a, pgrowlocks('a003.a003015_tbl') AS p WHERE p.locked_row = a.ctid order by sr_recno; Ao invés dele passo a usar: select colunas( 'a003.a003015_tbl' ); Fiz umas modificações, vide abaixo. Ao executar recebo o erro: ERROR: set-valued function called in context that cannot accept a set CONTEXT: PL/pgSQL function colunas while casting return value to function's return type. Obrigado! Adilson /* MODIFICADA - MODIFICADA - MODIFICADA /* -- Function: colunas(text) -- DROP FUNCTION colunas(text); CREATE OR REPLACE FUNCTION colunas( text ) RETURNS SETOF record AS $BODY$ DECLARE myrec RECORD; myst TEXT; BEGIN myst = 'select * FROM '||$1||' as a, pgrowlocks('||quote_literal($1)||') AS p WHERE p.locked_row = a.ctid order by sr_recno'; FOR myrec IN EXECUTE myst LOOP BEGIN EXECUTE myst; EXCEPTION WHEN lock_not_available THEN RETURN NEXT myrec; END; END LOOP; RETURN; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE STRICT COST 100 ROWS 1000; ALTER FUNCTION colunas(text) OWNER TO postgres; ___ 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
Em 01/11/08, tetraetila(R)[EMAIL PROTECTED] escreveu: - Original Message - From: Osvaldo Kussama [EMAIL PROTECTED] Não deu para entender o que você quer fazer. Vejamos: - innermyst é uma string que contém o comando SQL que você desja executar. - myrec é um record contendo todos os campos resultantes da junção da - tabela $1 com a tabela pgrowlocks. - você concatena a string com o record (sinceramente não sei qual o resultado) e tenta executar? Osvaldo ___ Nem eu? : - ) Caro Osvaldo Ela precisa me retornar o resultado como se eu tivesse feito este select: select * FROM a003.a003015_tbl as a, pgrowlocks('a003.a003015_tbl') AS p WHERE p.locked_row = a.ctid order by sr_recno; Ao invés dele passo a usar: select colunas( 'a003.a003015_tbl' ); Para fazer exatamente oque o SELECT acima faz, mas passando a tabela, teste a função: CREATE OR REPLACE FUNCTION colunas(text) RETURNS SETOF record AS $$ DECLARE myrec RECORD; myst TEXT; BEGIN myst = 'select * FROM ' || $1 || ' as a, pgrowlocks(' || quote_literal($1) || ') AS p WHERE p.locked_row = a.ctid order by sr_recno'; FOR myrec IN EXECUTE myst LOOP RETURN NEXT myrec; END LOOP; RETURN; END; $$ LANGUAGE 'plpgsql' VOLATILE STRICT; Para usar utilize: SELECT * FROM colunas('sua_tabela') AS foo(lista de tipo de campos de sua_tabela + lista de tipo de campos de pg_rowlocks); Osvaldo ___ 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
Adilson: Pelo visto você continua tentando trabalhar com bloqueios de registros. Já foi dito anteriormente, e vou insistir novamente: dê uma estudada na maneira como o PostgreSQL trabalha (particularmente MVCC [1]) pois é bem diferente da maneira com que um dbf trabalha. Osvaldo [1] http://pgdocptbr.sourceforge.net/pg80/mvcc.html#MVCC-INTRO ___ 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
Pessoal Este select abaixo funciona da forma que eu quero, ele me retorna os campos que estão bloqueados na tabela, Ok! Gostaria de fazer uma função com ele. select * FROM a003.a003015_tbl as a, pgrowlocks('a003.a003015_tbl') AS p WHERE p.locked_row = a.ctid order by sr_recno; Com base em uma função que achei no Google estou tentando adaptar o select acima para a função abaixo, não sei a linguagem plpgsql e estou estudando o Postgres, gostaria da ajuda de vocês para fazê-la funcionar. Muito obrigado, segue abaixo a função que estou tentando adaptar. Perdoem os erros! :- ) Adilson /* Retirada em parte da função CREATE OR REPLACE FUNCTION whichrowslocked(text,text) encontrada no Google. /* -- Function: colunas(text) -- DROP FUNCTION colunas(text); CREATE OR REPLACE FUNCTION colunas(text) RETURNS SETOF RECORD AS $BODY$ DECLARE myrec RECORD; myst TEXT; innermyst TEXT; BEGIN innermyst = 'select * FROM '||$1||' as a, pgrowlocks('||quote_literal($1)||') AS p WHERE p.locked_row = a.ctid order by sr_recno'; FOR myrec IN EXECUTE innermyst LOOP myst = innermyst||myrec; BEGIN EXECUTE myst; EXCEPTION WHEN lock_not_available THEN RETURN NEXT myrec; END; END LOOP; RETURN; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE STRICT COST 100 ROWS 1000; ALTER FUNCTION colunas(text) OWNER TO postgres; ___ 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
Em 31/10/08, tetraetila(R)[EMAIL PROTECTED] escreveu: Este select abaixo funciona da forma que eu quero, ele me retorna os campos que estão bloqueados na tabela, Ok! Gostaria de fazer uma função com ele. select * FROM a003.a003015_tbl as a, pgrowlocks('a003.a003015_tbl') AS p WHERE p.locked_row = a.ctid order by sr_recno; Com base em uma função que achei no Google estou tentando adaptar o select acima para a função abaixo, não sei a linguagem plpgsql e estou estudando o Postgres, gostaria da ajuda de vocês para fazê-la funcionar. Muito obrigado, segue abaixo a função que estou tentando adaptar. Perdoem os erros! :- ) Adilson /* Retirada em parte da função CREATE OR REPLACE FUNCTION whichrowslocked(text,text) encontrada no Google. /* -- Function: colunas(text) -- DROP FUNCTION colunas(text); CREATE OR REPLACE FUNCTION colunas(text) RETURNS SETOF RECORD AS $BODY$ DECLARE myrec RECORD; myst TEXT; innermyst TEXT; BEGIN innermyst = 'select * FROM '||$1||' as a, pgrowlocks('||quote_literal($1)||') AS p WHERE p.locked_row = a.ctid order by sr_recno'; FOR myrec IN EXECUTE innermyst LOOP myst = innermyst||myrec; BEGIN EXECUTE myst; EXCEPTION WHEN lock_not_available THEN RETURN NEXT myrec; END; END LOOP; RETURN; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE STRICT COST 100 ROWS 1000; ALTER FUNCTION colunas(text) OWNER TO postgres; Não deu para entender o que você quer fazer. Vejamos: - innermyst é uma string que contém o comando SQL que você desja executar. - myrec é um record contendo todos os campos resultantes da junção da tabela $1 com a tabela pgrowlocks. - você concatena a string com o record (sinceramente não sei qual o resultado) e tenta executar? Osvaldo ___ 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 Incrementar Mes ..
Necessito numa função, entrar com um data e um numero enteiro no segundo parametro que é a quantidade de meses a somar e retorna uma data... sei que existe a funcao date + interval ' x month' mas nao estou conseguindo implementar esse x como uma variável. Ficaria grato se alguem me desse uma dica. Santiago NSR Informática. ___ 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 Incrementar Mes ..
2008/10/15 Tatu [EMAIL PROTECTED] Necessito numa função, entrar com um data e um numero enteiro no segundo parametro que é a quantidade de meses a somar e retorna uma data... sei que existe a funcao date + interval ' x month' mas nao estou conseguindo implementar esse x como uma variável. Ficaria grato se alguem me desse uma dica. Você pode mostrar a sua consulta? []s Santiago NSR Informática. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- blog: http://www.midstorm.org/~telles/ e-mail / jabber: [EMAIL PROTECTED] ___ 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 Incrementar Mes ..
2008/10/15, Tatu [EMAIL PROTECTED]: Necessito numa função, entrar com um data e um numero enteiro no segundo parametro que é a quantidade de meses a somar e retorna uma data... sei que existe a funcao date + interval ' x month' mas nao estou conseguindo implementar esse x como uma variável. Ficaria grato se alguem me desse uma dica. Tente: sua_data + num_meses*'1 month'::interval Osvaldo ___ 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 Incrementar Mes ..
Olá, Tatu Segue abaixo uma função. Poderia verificar se é isso que você precisa. CREATE OR REPLACE FUNCTION soma_data(date,integer) RETURNS date AS $soma_data$ SELECT $1+$2; $soma_data$ LANGUAGE SQL IMMUTABLE; SELECT soma_data('2008-10-13',20); //chamando a função ou ainda de uma forma mais simples: SELECT current_date + 10; ou SELECT '2008-10-15'::date + 13; ou SELECT '2008-10-15'::date + interval '13 days'; (assim apresenta a data e a hora, porém a hora é truncada em 00:00:00). Se quiser descartar a data pode usar a função to_char. Espero ter ajudado. []s 2008/10/15 Tatu [EMAIL PROTECTED]: Necessito numa função, entrar com um data e um numero enteiro no segundo parametro que é a quantidade de meses a somar e retorna uma data... sei que existe a funcao date + interval ' x month' mas nao estou conseguindo implementar esse x como uma variável. Ficaria grato se alguem me desse uma dica. Santiago NSR Informática. ___ 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
Re: [pgbr-geral] Ajuda com Função Incrementar Mes ..
2008/10/15 Tatu [EMAIL PROTECTED]: Necessito numa função, entrar com um data e um numero enteiro no segundo parametro que é a quantidade de meses a somar e retorna uma data... $ PREPARE incrementador_de_dias(date,integer) AS SELECT $1 + $2; $ EXECUTE incrementador_dedias(CURRENT_DATE,30); sei que existe a funcao date + interval ' x month' mas nao estou conseguindo implementar esse x como uma variável. Envie a forma como está tentando implementar para facilitar um pouco. -Leo -- Leonardo Cezar http://pgcon.postgresql.org.br http://www.dextra.com.br/postgres ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral