On 09-04-2015 14:59, Matheus de Oliveira wrote:
> 2015-04-09 14:46 GMT-03:00 Fabrízio de Royes Mello <[email protected]>
> :
> 
>>     use_sql := 'SELECT ($1).[FIELD]';
>>     use_sql := replace( use_sql, '[FIELD]', quote_ident(p_field) );
>>
>>
> Nossa que horrível esse replace.
> 

Feio mesmo... kkkkk


>>
>> É uma PL antiga, dica do Pavel Stehule... até olhando pra ela dá pra dar
>> uma otimizada ali usando a função "format" pra criar o SQL dinâmico.
>>
> 
> Realmente, mas mesmo sendo antigo me pergunto porque ele não concatenou ao
> invés de usar esse replace.
> 
> De qualquer forma funciona, e é confiável. Mas para registro, eu usaria
> assim em versões mais recentes:
> 
>     CREATE FUNCTION pg_temp.get_field_from_record(p_record anyelement,
> p_field text)
>      RETURNS text
>      LANGUAGE PLPGSQL
>      IMMUTABLE
>     AS $$
>     DECLARE
>             v_ret text;
>     BEGIN
>             EXECUTE format('SELECT (($1).%I)::text', p_field) INTO v_ret
> USING p_record;
>             RETURN v_ret;
>     END;
>     $$;
> 

Esse código ficou bem mais elegante. Mas lembre-se que aquela do Pavel é
bem antiga, criada antes de existir o USING no "execute" e a função
"format" (que é uma mão na roda).

Att,

-- 
   Fabrízio de Royes Mello         Timbira - http://www.timbira.com.br/
   PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a