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.com>escreveu: > > 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