havia perdido a formatação
>CREATE OR REPLACE FUNCTION roundUp(valor numeric, qtDec integer)>RETURNS >     
>numeric>AS $$>DECLARE>  auxNum numeric;>        auxInt integer;>        auxStr 
>varchar;>BEGIN>  select round(valor, qtDec + 1) into auxNum;>    select 
>cast(substring(cast(auxNum as varchar) from (position('.' in cast(auxNum as 
>varchar)) + qtDec + 1) for 1) as integer) into auxInt;>>     if (auxInt > 0) 
>then>           select trunc(valor + cast(('0.' || repeat('0', qtDec - 1) || 
>1) as numeric),qtDec) into auxNum;>        else >          select 
>trunc(valor,qtDec) into auxNum;> end if;>        return auxNum;>END;>$$ 
>LANGUAGE plpgsql;>>select roundUp(1.123112,3)
Joel R. Benelli

> From: [email protected]
> Subject: Digest pgbr-geral, volume 50, assunto 15
> To: [email protected]
> Date: Fri, 8 Feb 2013 23:25:26 -0200
> 
> Send pgbr-geral mailing list submissions to
>       [email protected]
> 
> 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
>       [email protected]
> 
> You can reach the person managing the list at
>       [email protected]
> 
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of pgbr-geral digest..."
> 
> 
> Tópicos de Hoje:
> 
>    1. RES:  Round Unidade Superior (Paulo)
>    2. Re: Ref: Round Unidade Superior. (Dickson S. Guedes)
>    3. Re: ÍNDICES EM TABELAS QUE RECEBEM MUITOS INSERTS, UPDATES
>       (Dickson S. Guedes)
>    4. RES:  Ref: Round Unidade Superior. (Paulo)
>    5. Re: Function atualiza valor com nulo (Dickson S. Guedes)
>    6. Re: ÍNDICES EM TABELAS QUE RECEBEM MUITOS INSERTS, UPDATES
>       (Flavio Henrique Araque Gurgel)
> 
> 
> ----------------------------------------------------------------------
> 
> Message: 1
> Date: Fri, 8 Feb 2013 18:12:50 -0200
> From: "Paulo" <[email protected]>
> Subject: [pgbr-geral] RES:  Round Unidade Superior
> To: "'Comunidade PostgreSQL Brasileira'"
>       <[email protected]>
> Message-ID: <[email protected]>
> Content-Type: text/plain; charset="iso-8859-1"
> 
> Show de bola Joel,
> 
>  
> 
> Funcionou exatamente como o esperado.
> 
> Obrigado a todos que responderam.
> 
>  
> 
> Abraços a todos.
> 
>  
> 
> Paulo.
> 
> vp_logo
> 
> [email protected]
> 
>  
> 
>  
> 
> De: [email protected]
> [mailto:[email protected]] Em nome de Joel R.
> Benelli
> Enviada em: sexta-feira, 8 de fevereiro de 2013 17:36
> Para: postgres list
> Assunto: Re: [pgbr-geral] Round Unidade Superior
> 
>  
> 
> e ai Paulo, segue uma solução, se a unidade anterior ao decimal informado
> for maior que zero, soma 1 na unidade decimal informada.
> 
>  
> 
> CREATE OR REPLACE FUNCTION roundUp(valor numeric, qtDec integer)
> 
>  
> 
> select roundUp(1.123102,3);
> 
>  
> 
> até mais
> 
> 
> Joel R. Benelli
> 
> -------------- Próxima Parte ----------
> Um anexo em HTML foi limpo...
> URL: 
> http://listas.postgresql.org.br/pipermail/pgbr-geral/attachments/20130208/12a41698/attachment-0001.htm
>  
> -------------- Próxima Parte ----------
> Um anexo não texto foi limpo...
> Nome  : não disponível
> Tipo  : image/jpeg
> Tam   : 1788 bytes
> Descr.: não disponível
> Url   : 
> http://listas.postgresql.org.br/pipermail/pgbr-geral/attachments/20130208/12a41698/attachment-0001.jpeg
>  
> 
> ------------------------------
> 
> Message: 2
> Date: Fri, 8 Feb 2013 21:48:31 -0200
> From: "Dickson S. Guedes" <[email protected]>
> Subject: Re: [pgbr-geral] Ref: Round Unidade Superior.
> To: Comunidade PostgreSQL Brasileira
>       <[email protected]>
> Message-ID:
>       <cahhcrerrbfr7sh0nijaoyloynywu_jgqppmf5rwp+8bkxpr...@mail.gmail.com>
> Content-Type: text/plain; charset=UTF-8
> 
> Em 8 de fevereiro de 2013 15:22, Paulo <[email protected]> 
> escreveu:
> > Ola Pessoal,
> >
> > Como posso forçar um arredondamento para unidade superior,
> > Por Ex:
> >
> > SELECT ROUND(115.00/12,2);  Retorno: 9.58,
> >
> > Se multiplicar por 12 * 9.58 = 114,96
> >
> > Preciso forçar retorno 9.59 * 12 = 115,08
> >
> > Alguma ideia ?
> 
> Você diz que precisa "forçar o retorno", então creio que na real você
> precise considerar mais casas decimais em seus cálculos, então vou
> considerar que voce quer levar em consideração até a terceira casa
> após à v?igula logo você precisa  i) carregar o ponto flutuante no seu
> cálculo (ou seja, não arredonde antes) ou ii) somar 0.004 e arredondar
> depois
> 
> Eu vou optar pela opção ii:
> 
> postgres=# select round((115.00/12) + 0.004,2);
>  round
> -------
>   9.59
> 
> postgres=# select round(9.58333333333333 + 0.004,2);
>  round
> -------
>   9.59
> 
> postgres=# select round(9.5891 + 0.004,2);
>  round
> -------
>   9.59
> 
> postgres=# select round((115.00/12) + 0.005,2) * 12;
>  ?column?
> ----------
>    115.08
> 
> Já que você está considerando apenas 2 (duas) casas após à vírgula o
> uso do 0.004 torna-se desprezível para a operação como um todo, mas
> não para o round. Em outras palavras você vai "forçar" ele arredondar
> sempre que você tiver, no mínimo, 0.001, já que este, somado aos 0.004
> chega aos 0.005 que arrendondado vai para 0.01.
> 
> Se não for isso o que você precisa, eu não entendi sua pergunta.
> 
> []s
> --
> Dickson S. Guedes
> mail/xmpp: [email protected] - skype: guediz
> http://github.com/guedes - http://guedesoft.net
> http://www.postgresql.org.br
> 
> 
> ------------------------------
> 
> Message: 3
> Date: Fri, 8 Feb 2013 22:02:59 -0200
> From: "Dickson S. Guedes" <[email protected]>
> Subject: Re: [pgbr-geral] ÍNDICES EM TABELAS QUE RECEBEM MUITOS
>       INSERTS, UPDATES
> To: Comunidade PostgreSQL Brasileira
>       <[email protected]>
> Message-ID:
>       <CAHHcreomfRaj-G98JmR8KYkfG2YpqmNUQ2DOYgs56=fle+c...@mail.gmail.com>
> Content-Type: text/plain; charset=ISO-8859-1
> 
> Em 8 de fevereiro de 2013 09:47, Wellington Openheimer
> <[email protected]> escreveu:
> [... corte ...]
> > Decidimos então testar a criação de uns índices com os principais campos nas
> > cláusulas WHERE das consultas mais lentas.
> >
> > A consulta ficou bem mais rápida, mas estamos receosos se estes índices irão
> > deixar mais lenta a inserção e update de dados
> > pois esses comandos teriam então que inserir no índice também.
> 
> Como o Flávio falou em outro e-mail, sim os índices vão deixar mais
> lentos os UPDATES e INSERTs por exemplo, mas a questão que você
> precisa levar em consideração é se este tempo pode ser desprezado.
> Veja, você percebeu uma lentidão na consulta, atuou pontualmente com
> um índice e minimizou os eu problema, você otimizou quando precisou.
> 
> Sendo assim não se preocupe neste momento com o tempo  de inserção a
> menos que ele comece a ser um problema para o seu ambiente. Neste
> caso, uma alternativa poderia ser o uso de tablespaces separando estes
> índices específicos em outros discos, de preferência discos mais
> rápidos ou até mesmo ramdisks. Mas isto não é uma regra, é apenas um
> exemplo de uma alternativa caso você perceba problemas.
> 
> []s
> -- 
> Dickson S. Guedes
> mail/xmpp: [email protected] - skype: guediz
> http://github.com/guedes - http://guedesoft.net
> http://www.postgresql.org.br
> 
> 
> ------------------------------
> 
> Message: 4
> Date: Fri, 8 Feb 2013 22:07:53 -0200
> From: "Paulo" <[email protected]>
> Subject: [pgbr-geral] RES:  Ref: Round Unidade Superior.
> To: "'Comunidade PostgreSQL Brasileira'"
>       <[email protected]>
> Message-ID: <[email protected]>
> Content-Type: text/plain;     charset="utf-8"
> 
> Muito bom, bom mesmo.
> Obrigado Dickson.
> 
> Att,
> 
> Paulo.
> 
> Eu vou optar pela opção ii:
> 
> postgres=# select round((115.00/12) + 0.004,2);
>  round
> -------
>   9.59
> 
> postgres=# select round(9.58333333333333 + 0.004,2);
>  round
> -------
>   9.59
> 
> postgres=# select round(9.5891 + 0.004,2);
>  round
> -------
>   9.59
> 
> postgres=# select round((115.00/12) + 0.005,2) * 12;
>  ?column?
> ----------
>    115.08
> 
> Já que você está considerando apenas 2 (duas) casas após à vírgula o
> uso do 0.004 torna-se desprezível para a operação como um todo, mas
> não para o round. Em outras palavras você vai "forçar" ele arredondar
> sempre que você tiver, no mínimo, 0.001, já que este, somado aos 0.004
> chega aos 0.005 que arrendondado vai para 0.01.
> 
> Se não for isso o que você precisa, eu não entendi sua pergunta.
> 
> []s
> --
> Dickson S. Guedes
> mail/xmpp: [email protected] - skype: guediz
> http://github.com/guedes - http://guedesoft.net
> http://www.postgresql.org.br
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
> 
> 
> 
> ------------------------------
> 
> Message: 5
> Date: Fri, 8 Feb 2013 22:10:31 -0200
> From: "Dickson S. Guedes" <[email protected]>
> Subject: Re: [pgbr-geral] Function atualiza valor com nulo
> To: Comunidade PostgreSQL Brasileira
>       <[email protected]>
> Message-ID:
>       <CAHHcreruNdsE3WssjbtsCXQJNbO1v=-uen+y7x5srbkzvfr...@mail.gmail.com>
> Content-Type: text/plain; charset=ISO-8859-1
> 
> 2013/2/8 Edson - Lista <[email protected]>:
> > Em 08/02/2013 11:23, Wolak escreveu:
> >> COALESCE(vlr_saldo,0) +
> >> COALESCE(old.vlr_pgto,0).
> > também não deu certo.
> 
> 
> Coloque alguns RAISE DEBUG 'x=%, y=%, ....', NEW.x, NEW.y, ....; pelo
> seu código dentro dos IFs, mude o nível de log do cliente para DEBUG e
> acompanhe os resultados para ver onde estão vindo os NULLs.
> 
> []s
> -- 
> Dickson S. Guedes
> mail/xmpp: [email protected] - skype: guediz
> http://github.com/guedes - http://guedesoft.net
> http://www.postgresql.org.br
> 
> 
> ------------------------------
> 
> Message: 6
> Date: Fri, 8 Feb 2013 23:28:05 -0200 (BRST)
> From: Flavio Henrique Araque Gurgel <[email protected]>
> Subject: Re: [pgbr-geral] ÍNDICES EM TABELAS QUE RECEBEM MUITOS
>       INSERTS, UPDATES
> To: Comunidade PostgreSQL Brasileira
>       <[email protected]>
> Message-ID:
>       <[email protected]>
> Content-Type: text/plain; charset=utf-8
> 
> > Essa é a chave da tabela:
> > pk_tb_matricula PRIMARY KEY(matr , cursocod , gradecod , disccodof , periodo
> > , ano );
> > 
> > Esses são os 2 índices que fizeram diferença na execução da consulta do
> > programa:
> > CREATE INDEX turma_teo
> > ON tb_matricula
> > USING btree
> > (turmateo COLLATE pg_catalog."default" , ano , periodo );
> > 
> > CREATE INDEX turmapra_idx
> > ON tb_matricula
> > USING btree
> > (turmapra COLLATE pg_catalog."default" , ano , periodo );
> > 
> > Esta é a consulta complicada:
> > O problema é que o programa faz um FOR nesta consulta, pois é um count de
> > cada turma.
> > 
> > explain analyze SELECT COUNT(*)
> > FROM TB_MATRICULA
> > WHERE DISCCODOF= 'ADM082' AND
> > LOCALCOD = 'C01' AND
> > ((REGIME = 'A' AND ANO = 2012) OR
> > (REGIME !='A' AND ANO = 2012 AND PERIODO = 1)) AND
> > (TURMATEO = 'X') OR
> > ('TURMAPRA = 'Y'));
> > 
> > Esse foi o resultado do Explain:
> > "Aggregate (cost=4835.89..4835.90 rows=1 width=0) (actual 
> > time=39.486..39.486
> > rows=1 loops=1)"
> > " -> Index Scan using pk_tb_matricula on tb_matricula (cost=0.00..4835.02
> > rows=351 width=0) (actual time=0.190..39.231 rows=1520 loops=1)"
> > " Index Cond: (((disccodof)::text = 'ADM082'::text) AND (ano = 2012))"
> > " Filter: ((localcod = 'C01'::bpchar) AND (((turmateo)::text = '1'::text) OR
> > ((turmapra)::text = ''::text)) AND ((regime = 'A'::bpchar) OR ((regime <>
> > 'A'::bpchar) AND (periodo = 1))))"
> > "Total runtime: 39.591 ms"
> 
> Bom, veja seu plano de execução:
> A consulta usou apenas o índice da chave primária (pg_tb_matricula).
> A consulta levou pouco mais de 39 ms para executar, obteve uma linha 
> agregando 4835 (por causa do count) e fim, dentre 
> Portanto, os índices turmapra_idx e turma_teo, para essa consulta em 
> específico, não estão sendo utilizados.
> 
> Considere removê-los e veja se o plano de execução muda (faça outro EXPLAIN 
> ANALYZE sem os índices).
> Se o plano *não* mudar (não deve mudar, porque o índice usado foi o da pk), 
> simplesmente fique sem os índices exceto a própria chave primária. Claro que 
> não estou considerando outras consultas que você pode ter em seu sistema.
> 
> 39 ms me parece um tempo excelente para execução de uma consulta com count(*).
> Você disse que faz um laço em seu programa (for) e executa a consulta várias 
> vezes. Quantas vezes?
> Não dá pra trocar o laço por uma consulta mais elaborada e deixar o banco de 
> dados fazer isso por você?
> 
> Outra coisa interessante, qual versão do PostgreSQL está usando?
> Na versão 9.2.x você tem o recurso index_only_scan que pode melhorar o 
> desempenho dessa consulta em umas... 10 ou 12 vezes. Não que você precise 
> disso, claro.
> 
> []s
> 
> __________________________________
> Flavio Henrique A. Gurgel
> Líder de Projetos Especiais
> Consultoria, Projetos & Treinamentos 4LINUX
> Tel1: +55-11.2125-4747 ou 2125-4748
> www.4linux.com.br
> email: [email protected]
> ______________________________
> FREE SOFTWARE SOLUTIONS
> 
> 
> ------------------------------
> 
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
> 
> 
> Fim da Digest pgbr-geral, volume 50, assunto 15
> ***********************************************
                                          
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a