2012/5/20 Anselmo Silva <[email protected]>
> 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
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral