Re: [pgbr-geral] Divisão de inteiros com resultado numeric

2012-05-23 Por tôpico Matheus de Oliveira
2012/5/22 Alexsander Rosa alexsander.r...@gmail.com

 Sugiro incluir alguma segurança: calcule('true; TRUNCATE
 tabela_importante') funciona.


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


Re: [pgbr-geral] Divisão de inteiros com resultado numeric

2012-05-22 Por tôpico Alexsander Rosa
Sugiro incluir alguma segurança: calcule('true; TRUNCATE
tabela_importante') funciona.

Em 20 de maio de 2012 10:05, Matheus de Oliveira
matioli.math...@gmail.comescreveu:


 2012/5/20 Anselmo Silva anselmo@gmail.com

 Qual versão do PostgreSQL fizeste?

 Resultado:
 ao criar a função :
 AVISO:  uso de escape fora do padrão em cadeia de caracteres
 LINE 1: SELECT 'SELECT ' || regexp_replace(calculo, '([0-9]+)([^\.0-...

 ao executá-la usando: *Calcule ('1/10')*

 ERRO: erro de sintaxe em ou próximo a  
 SQL state: 42601
 Context: PL/pgSQL function calcule line 4 at comando EXECUTE



 Não era para usar o escape por padrão.

 Corrigindo para funcionar em qualquer versão:

 CREATE OR REPLACE FUNCTION public.calcule(calculo text)
 RETURNS numeric
 LANGUAGE plpgsql
 AS $function$
 DECLARE
 v_result numeric;
 BEGIN
 EXECUTE 'SELECT ' || regexp_replace(calculo, E'([0-9]+)([^\\.0-9])',
 E'\\1::numeric\\2', 'g')

 INTO v_result;
 RETURN v_result;
 END;
 $function$;

 Testado na 9.1. Não tive tempo ontem, mas vou explicar o que a função faz,
 como não testei muito pode ser que precise de ajustes. Esta função vai
 pegar todo número inteiro e colocar ::numeric na frente (para ver o
 resultado você pode usar um RAISE), em seguida dá um execute nesse
 resultado.

 Explicado a expressão regular, o padrão E'([0-9]+)([^\\.0-9])' vai
 procurar por caracteres de 0 a 9 seguidos de um caractere que *não* seja
 ponto (resumindo, um inteiro). O valor de substituição E'\\1::numeric\\2'vai 
 trocar o inteiro por ele mesmo mais o cast para numeric, e colocar de
 volta o caractere que não é ponto.

 Se for usar isso mesmo, faça um milhão de testes e ainda use try-catch na
 aplicação onde estiver usando, pois o que você passar também corre o risco
 de estar mal-formado. Apesar que estou achando essa função interessante
 para ser usada em fórmulas definidas pelo usuário.


 Atenciosamente,
 --
 Matheus de Oliveira


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




-- 
Atenciosamente,
Alexsander da Rosa
http://rednaxel.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] Divisão de inteiros com resultado numeric

2012-05-20 Por tôpico Anselmo Silva
Qual versão do PostgreSQL fizeste?

Resultado:
ao criar a função :
AVISO:  uso de escape fora do padrão em cadeia de caracteres
LINE 1: SELECT 'SELECT ' || regexp_replace(calculo, '([0-9]+)([^\.0-...

ao executá-la usando: *Calcule ('1/10')*

ERRO: erro de sintaxe em ou próximo a 
SQL state: 42601
Context: PL/pgSQL function calcule line 4 at comando EXECUTE


2012/5/19 Matheus de Oliveira matioli.math...@gmail.com


 2012/5/19 Matheus de Oliveira matioli.math...@gmail.com

 Essa função em si não parece ser uma boa prática, mas dá pra usar
 expressão regular pra tentar fazer o que você quer.

 Exemplo:

 CREATE OR REPLACE FUNCTION CALCULE (calculo text)
 RETURNS NUMERIC AS $$
 DECLARE
 v_result numeric;
 BEGIN
 EXECUTE 'SELECT ' || regexp_replace(calculo, '([0-9]+)',
 '\1::numeric', 'g')
 INTO v_result;
 RETURN v_result;
 END;
 $$ LANGUAGE plpgsql;


 Aviso: código não testado...


 Corrigindo pra aceitar valor decimal:


 CREATE OR REPLACE FUNCTION CALCULE (calculo text)
 RETURNS NUMERIC AS $$
 DECLARE
 v_result numeric;
 BEGIN
 EXECUTE 'SELECT ' || regexp_replace(calculo, '([0-9]+)([^\.0-9])',
 '\1::numeric\2', 'g')

 INTO v_result;
 RETURN v_result;
 END;
 $$ LANGUAGE plpgsql;

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




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


Re: [pgbr-geral] Divisão de inteiros com resultado numeric

2012-05-20 Por tôpico Matheus de Oliveira
2012/5/20 Anselmo Silva anselmo@gmail.com

 Qual versão do PostgreSQL fizeste?

 Resultado:
 ao criar a função :
 AVISO:  uso de escape fora do padrão em cadeia de caracteres
 LINE 1: SELECT 'SELECT ' || regexp_replace(calculo, '([0-9]+)([^\.0-...

 ao executá-la usando: *Calcule ('1/10')*

 ERRO: erro de sintaxe em ou próximo a  
 SQL state: 42601
 Context: PL/pgSQL function calcule line 4 at comando EXECUTE



Não era para usar o escape por padrão.

Corrigindo para funcionar em qualquer versão:

CREATE OR REPLACE FUNCTION public.calcule(calculo text)
RETURNS numeric
LANGUAGE plpgsql
AS $function$
DECLARE
v_result numeric;
BEGIN
EXECUTE 'SELECT ' || regexp_replace(calculo, E'([0-9]+)([^\\.0-9])',
E'\\1::numeric\\2', 'g')
INTO v_result;
RETURN v_result;
END;
$function$;

Testado na 9.1. Não tive tempo ontem, mas vou explicar o que a função faz,
como não testei muito pode ser que precise de ajustes. Esta função vai
pegar todo número inteiro e colocar ::numeric na frente (para ver o
resultado você pode usar um RAISE), em seguida dá um execute nesse
resultado.

Explicado a expressão regular, o padrão E'([0-9]+)([^\\.0-9])' vai procurar
por caracteres de 0 a 9 seguidos de um caractere que *não* seja ponto
(resumindo, um inteiro). O valor de substituição E'\\1::numeric\\2' vai
trocar o inteiro por ele mesmo mais o cast para numeric, e colocar de volta
o caractere que não é ponto.

Se for usar isso mesmo, faça um milhão de testes e ainda use try-catch na
aplicação onde estiver usando, pois o que você passar também corre o risco
de estar mal-formado. Apesar que estou achando essa função interessante
para ser usada em fórmulas definidas pelo usuário.

Atenciosamente,
--
Matheus de Oliveira
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Divisão de inteiros com resultado numeric

2012-05-19 Por tôpico Matheus de Oliveira
Essa função em si não parece ser uma boa prática, mas dá pra usar expressão
regular pra tentar fazer o que você quer.

Exemplo:

CREATE OR REPLACE FUNCTION CALCULE (calculo text)
RETURNS NUMERIC AS $$
DECLARE
v_result numeric;
BEGIN
EXECUTE 'SELECT ' || regexp_replace(calculo, '([0-9]+)', '\1::numeric',
'g')
INTO v_result;
RETURN v_result;
END;
$$ LANGUAGE plpgsql;


Aviso: código não testado...

Atenciosamente,
--
Matheus de Oliveira
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Divisão de inteiros com resultado numeric

2012-05-19 Por tôpico Matheus de Oliveira
2012/5/19 Matheus de Oliveira matioli.math...@gmail.com

 Essa função em si não parece ser uma boa prática, mas dá pra usar
 expressão regular pra tentar fazer o que você quer.

 Exemplo:

 CREATE OR REPLACE FUNCTION CALCULE (calculo text)
 RETURNS NUMERIC AS $$
 DECLARE
 v_result numeric;
 BEGIN
 EXECUTE 'SELECT ' || regexp_replace(calculo, '([0-9]+)',
 '\1::numeric', 'g')
 INTO v_result;
 RETURN v_result;
 END;
 $$ LANGUAGE plpgsql;


 Aviso: código não testado...


Corrigindo pra aceitar valor decimal:

CREATE OR REPLACE FUNCTION CALCULE (calculo text)
RETURNS NUMERIC AS $$
DECLARE
v_result numeric;
BEGIN
EXECUTE 'SELECT ' || regexp_replace(calculo, '([0-9]+)([^\.0-9])',
'\1::numeric\2', 'g')
INTO v_result;
RETURN v_result;
END;
$$ 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] Divisão de inteiros com resultado numeric

2012-05-14 Por tôpico Anselmo Silva
Pessoal, andei lendo mais e meu resultado mais estruturado é o seguinte:

CREATE FUNCTION DivIntToNum(i1 integer, i2 integer)
RETURNS NUMERIC AS
$BODY$
SELECT CAST($1 AS NUMERIC) / CAST($2 AS NUMERIC);
$BODY$
LANGUAGE SQL;

CREATE OPERATOR !/ (
leftarg = integer,
rightarg = integer,
procedure = DivIntToNum,
commutator = !/
);


O uso do operador de divisão com resultado numeric é simples;

SELECT 1 !/ 10

Aceito Críticas... Obrigado a todos pela boa discursão que tivemos sobre o
assunto!

Em 12 de maio de 2012 23:14, Leandro Guimarães Faria Corcete DUTRA 
l...@dutras.org escreveu:

 Le 2012-5-12 16h16, Anselmo Silva a écrit :
  acredito que tem uma razão para isso, que reconheço não saber

 Basicamente, é porque a linguagem SQL tem de ter comportamento
 consistente, e respeitar a definição dos tipos dos dados.

Isso não é uma opção, é parte da definição da linguagem SQL.  O
 PostgreSQL tenta seguir essa definição, que é dada pelo padrão ISO SQL
 mais recente.


  em algumas situações não é muito prático

 A questão de se é prático deve ser contextualizada.  O SQL é prático se
 os programas forem claros, consistentes, com poucos erros.  O tratamento
 estrito dos tipos de dados facilitam isso.  É um contexto muito
 diferente daquele de uso duma calculadora.

Outros sistemas fazem as conversões implícitas.  Há pelo menos dois
 problemas com isso.  Um é que cada um faz conversões de determinada
 maneira, inconsistente com os outros.  Outro é que nem sempre o
 programador entende o que o sistema fez implicitamente.  Para evitar
 esses dois problemas é que o padrão ISO SQL exige as conversões
 explícitas.  Se o PostgreSQL as abandonasse, desviar-se-a do padrão,
 tornando o código menos portável, e além disso voltaria a permitir que
 os programadores introduzissem erros por confiarem em comportamentos
 implícitos mal compreendidos.


 --
 skype:leandro.gfc.dutra?chat  Yahoo!: ymsgr:sendIM?lgcdutra
 +55 (61) 3546 7191  gTalk: xmpp:leand...@jabber.org
 +55 (11) 9406 7191ICQ/AIM: aim:GoIM?screenname=61287803
 BRAZIL GMT-3  MSN: msnim:chat?contact=lean...@dutra.fastmail.fm
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




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


[pgbr-geral] Divisão de inteiros com resultado numeric

2012-05-12 Por tôpico Anselmo Silva
Pergunta de newbie de PostgreSQL.
Pretendo fazer uma função que me faça um cálculo matemático de um text
passado como parâmetro.
Algo Assim:

CREATE FUNCTION CALCULE (calculo text) RETURNS NUMERIC...

Até aí tudo bem. Mas me deparei com uma regra que não entendi direito, mas,
deve ter um motivo:

A divisão de números inteiros resulta em um número inteiro

Meu problema é:

Tendo sido dado o seguinte com base na minha função acima:

SELECT CALCULE('1/10');

Gostaria de obter o resultado fracionado sem ter de tratar a string passada
para converte-las em numeric
antes de efetuar a operação.

Já busquei em tudo que é lugar mas a resposta é a mesma:

Tem de converter ao menos um dos operandos para real ou numeric...

Alguém tem alguma idéia mais eficiente?


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


Re: [pgbr-geral] Divisão de inteiros com resultado numeric

2012-05-12 Por tôpico Rodrigo Della Justina
olhe a expressão CAST, para te auxiliar utilizando esse cálculo

#  http://www.postgresql.org/docs/8.3/static/sql-expressions.html

Att
Rodrigo

Em 12 de maio de 2012 14:48, Anselmo Silva anselmo@gmail.com escreveu:

 Pergunta de newbie de PostgreSQL.
 Pretendo fazer uma função que me faça um cálculo matemático de um text
 passado como parâmetro.
 Algo Assim:

 CREATE FUNCTION CALCULE (calculo text) RETURNS NUMERIC...

 Até aí tudo bem. Mas me deparei com uma regra que não entendi direito,
 mas, deve ter um motivo:

 A divisão de números inteiros resulta em um número inteiro

 Meu problema é:

 Tendo sido dado o seguinte com base na minha função acima:

 SELECT CALCULE('1/10');

 Gostaria de obter o resultado fracionado sem ter de tratar a string
 passada para converte-las em numeric
 antes de efetuar a operação.

 Já busquei em tudo que é lugar mas a resposta é a mesma:

 Tem de converter ao menos um dos operandos para real ou numeric...

 Alguém tem alguma idéia mais eficiente?


 --
 Anselmo M. Silva

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




-- 
*Atenciosamente*
*
*
*Rodrigo Della Justina*
*rodrigodellajust...@gmail.com*
*rodrigodellajust...@ciss.com.br*
Telp: 55-46-8801-6165

*IBM DB2 Certified Database Academic*
*
*
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Divisão de inteiros com resultado numeric

2012-05-12 Por tôpico Anselmo Silva
Rodrigo Della, conheço o cast. Mas, Como eu disse, não queria tratar a
string. Na sua sugestão para obter meu resultado eu teria que fazer o
seguinte:

SELECT CAST('1' AS NUMERIC) / CAST ('10' AS NUMERIC)

Considere que recebo a string já pronta.

Em 12 de maio de 2012 14:58, Rodrigo Della Justina 
rodrigodellajust...@gmail.com escreveu:

 olhe a expressão CAST, para te auxiliar utilizando esse cálculo

 #  http://www.postgresql.org/docs/8.3/static/sql-expressions.html

 Att
 Rodrigo

 Em 12 de maio de 2012 14:48, Anselmo Silva anselmo@gmail.comescreveu:

 Pergunta de newbie de PostgreSQL.
 Pretendo fazer uma função que me faça um cálculo matemático de um text
 passado como parâmetro.
 Algo Assim:

 CREATE FUNCTION CALCULE (calculo text) RETURNS NUMERIC...

 Até aí tudo bem. Mas me deparei com uma regra que não entendi direito,
 mas, deve ter um motivo:

 A divisão de números inteiros resulta em um número inteiro

 Meu problema é:

 Tendo sido dado o seguinte com base na minha função acima:

 SELECT CALCULE('1/10');

 Gostaria de obter o resultado fracionado sem ter de tratar a string
 passada para converte-las em numeric
 antes de efetuar a operação.

 Já busquei em tudo que é lugar mas a resposta é a mesma:

 Tem de converter ao menos um dos operandos para real ou numeric...

 Alguém tem alguma idéia mais eficiente?


 --
 Anselmo M. Silva

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




 --
 *Atenciosamente*
 *
 *
 *Rodrigo Della Justina*
 *rodrigodellajust...@gmail.com*
 *rodrigodellajust...@ciss.com.br*
 Telp: 55-46-8801-6165

 *IBM DB2 Certified Database Academic*
 *
 *


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




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


Re: [pgbr-geral] Divisão de inteiros com resultado numeric

2012-05-12 Por tôpico Leandro DUTRA, Guimarães Faria Corcete
Le 2012-5-12 15h8, Anselmo Silva a écrit :
 conheço o cast. Mas, Como eu disse, não queria tratar a string

Não entendi, por que não?  É a coisa certa, tanto pela teoria, quanto 
pelo padrão ISO SQL.  Não existe cálculo sobre seqüência de caracteres. 
  Outros sistemas implementam, mas os detalhes são inconsistentes; com o 
CAST (), temos consistência.


-- 
skype:leandro.gfc.dutra?chat  Yahoo!: ymsgr:sendIM?lgcdutra
+55 (61) 3546 7191  gTalk: xmpp:leand...@jabber.org
+55 (11) 9406 7191ICQ/AIM: aim:GoIM?screenname=61287803
BRAZIL GMT-3  MSN: msnim:chat?contact=lean...@dutra.fastmail.fm
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Divisão de inteiros com resultado numeric

2012-05-12 Por tôpico Fabrízio de Royes Mello
Em 12 de maio de 2012 18:02, Osvaldo Kussama
osvaldo.kuss...@gmail.comescreveu:


 Para este caso em particular (uma operação aritmética) creio que
 funcionaria colocar em sua função:
 EXECUTE 'SELECT ' || parametro ||'::numeric;' INTO resultado;


Essa solução não resolve por completo expressões aritméticas.

Se a expressão for, por exemplo:

5/2+5

O resultado que irá ser apresentado com aquele SELECT dinâmico é:

bdteste=# select 5/2+5::numeric;
 ?column?
--
7
(1 row)

E o resultado correto seria 7,5.

Isso porque o PostgreSQL considera como inteiros os valores sem casa
decimal (com ponto .) que não tenha sido definido explicitamente o tipo
de dado.

Para sua solução funcionar creio que não irá fugir de fazer um pequeno
parser na sua expressão aritmética e separar os seus literais e sinais para
recompor ela com os casts adequados e só assim usar o EXECUTE.

Att,

-- 
Fabrízio de Royes Mello
Consultoria/Coaching PostgreSQL
 Blog sobre TI: http://fabriziomello.blogspot.com
 Perfil Linkedin: http://br.linkedin.com/in/fabriziomello
 Twitter: http://twitter.com/fabriziomello
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Divisão de inteiros com resultado numeric

2012-05-12 Por tôpico Osvaldo Kussama
Em 12/05/12, Anselmo Silvaanselmo@gmail.com escreveu:
 Pergunta de newbie de PostgreSQL.
 Pretendo fazer uma função que me faça um cálculo matemático de um text
 passado como parâmetro.
 Algo Assim:

 CREATE FUNCTION CALCULE (calculo text) RETURNS NUMERIC...

 Até aí tudo bem. Mas me deparei com uma regra que não entendi direito, mas,
 deve ter um motivo:

 A divisão de números inteiros resulta em um número inteiro

 Meu problema é:

 Tendo sido dado o seguinte com base na minha função acima:

 SELECT CALCULE('1/10');

 Gostaria de obter o resultado fracionado sem ter de tratar a string passada
 para converte-las em numeric
 antes de efetuar a operação.

 Já busquei em tudo que é lugar mas a resposta é a mesma:

 Tem de converter ao menos um dos operandos para real ou numeric...

 Alguém tem alguma idéia mais eficiente?



Para este caso em particular (uma operação aritmética) creio que
funcionaria colocar em sua função:
EXECUTE 'SELECT ' || parametro ||'::numeric;' INTO resultado;

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] Divisão de inteiros com resultado numeric

2012-05-12 Por tôpico Osvaldo Kussama
Em 12/05/12, Fabrízio de Royes Mellofabriziome...@gmail.com escreveu:
 Em 12 de maio de 2012 18:02, Osvaldo Kussama
 osvaldo.kuss...@gmail.comescreveu:


 Para este caso em particular (uma operação aritmética) creio que
 funcionaria colocar em sua função:
 EXECUTE 'SELECT ' || parametro ||'::numeric;' INTO resultado;


 Essa solução não resolve por completo expressões aritméticas.

 Se a expressão for, por exemplo:

 5/2+5

 O resultado que irá ser apresentado com aquele SELECT dinâmico é:

 bdteste=# select 5/2+5::numeric;
  ?column?
 --
 7
 (1 row)

 E o resultado correto seria 7,5.

 Isso porque o PostgreSQL considera como inteiros os valores sem casa
 decimal (com ponto .) que não tenha sido definido explicitamente o tipo
 de dado.

 Para sua solução funcionar creio que não irá fugir de fazer um pequeno
 parser na sua expressão aritmética e separar os seus literais e sinais para
 recompor ela com os casts adequados e só assim usar o EXECUTE.



Concordo.
Talvez devesse ter escrito uma operação aritmética simples como o
exemplificado.
Não sei quais são as reais necessidades do Anselmo, pode ser que esta
solução simples atenda.

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] Divisão de inteiros com resultado numeric

2012-05-12 Por tôpico Anselmo Silva
Osvaldo Kussama, para a necessidade do momento eu já tinha feito um RTA do
seguinte modo:

 EXECUTE 'SELECT ' || parametro ||'.0' INTO resultado;

quase idêntico à sua sugestão (a sua leva vantagens).
O que eu queria era saber se, por curiosidade, havia algo mais estruturado
já pronto no próprio SGDB
para isso, mas, aparentemente não há devido à minha proposta ser uma
violação de alguma regra no
cálculo interno que é feito quando da utilização de tais parâmetros.

Em 12 de maio de 2012 18:28, Osvaldo Kussama
osvaldo.kuss...@gmail.comescreveu:

 Em 12/05/12, Fabrízio de Royes Mellofabriziome...@gmail.com escreveu:
  Em 12 de maio de 2012 18:02, Osvaldo Kussama
  osvaldo.kuss...@gmail.comescreveu:
 
 
  Para este caso em particular (uma operação aritmética) creio que
  funcionaria colocar em sua função:
  EXECUTE 'SELECT ' || parametro ||'::numeric;' INTO resultado;
 
 
  Essa solução não resolve por completo expressões aritméticas.
 
  Se a expressão for, por exemplo:
 
  5/2+5
 
  O resultado que irá ser apresentado com aquele SELECT dinâmico é:
 
  bdteste=# select 5/2+5::numeric;
   ?column?
  --
  7
  (1 row)
 
  E o resultado correto seria 7,5.
 
  Isso porque o PostgreSQL considera como inteiros os valores sem casa
  decimal (com ponto .) que não tenha sido definido explicitamente o tipo
  de dado.
 
  Para sua solução funcionar creio que não irá fugir de fazer um pequeno
  parser na sua expressão aritmética e separar os seus literais e sinais
 para
  recompor ela com os casts adequados e só assim usar o EXECUTE.
 


 Concordo.
 Talvez devesse ter escrito uma operação aritmética simples como o
 exemplificado.
 Não sei quais são as reais necessidades do Anselmo, pode ser que esta
 solução simples atenda.

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




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


Re: [pgbr-geral] Divisão de inteiros com resultado numeric

2012-05-12 Por tôpico Leandro Guimarães Faria Corcete DUTRA
Le 2012-5-12 16h16, Anselmo Silva a écrit :
 acredito que tem uma razão para isso, que reconheço não saber

Basicamente, é porque a linguagem SQL tem de ter comportamento 
consistente, e respeitar a definição dos tipos dos dados.

Isso não é uma opção, é parte da definição da linguagem SQL.  O 
PostgreSQL tenta seguir essa definição, que é dada pelo padrão ISO SQL 
mais recente.


 em algumas situações não é muito prático

A questão de se é prático deve ser contextualizada.  O SQL é prático se 
os programas forem claros, consistentes, com poucos erros.  O tratamento 
estrito dos tipos de dados facilitam isso.  É um contexto muito 
diferente daquele de uso duma calculadora.

Outros sistemas fazem as conversões implícitas.  Há pelo menos dois 
problemas com isso.  Um é que cada um faz conversões de determinada 
maneira, inconsistente com os outros.  Outro é que nem sempre o 
programador entende o que o sistema fez implicitamente.  Para evitar 
esses dois problemas é que o padrão ISO SQL exige as conversões 
explícitas.  Se o PostgreSQL as abandonasse, desviar-se-a do padrão, 
tornando o código menos portável, e além disso voltaria a permitir que 
os programadores introduzissem erros por confiarem em comportamentos 
implícitos mal compreendidos.


-- 
skype:leandro.gfc.dutra?chat  Yahoo!: ymsgr:sendIM?lgcdutra
+55 (61) 3546 7191  gTalk: xmpp:leand...@jabber.org
+55 (11) 9406 7191ICQ/AIM: aim:GoIM?screenname=61287803
BRAZIL GMT-3  MSN: msnim:chat?contact=lean...@dutra.fastmail.fm
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral