Yoshio escreveu:
> 2008/6/23 Emerson Casas Salvador <[EMAIL PROTECTED]>:
>> Yoshio escreveu:
>>> Olá pessoal.
>>> Como faço para concatenar vários campos (linha) delimitados com algum
>>> caracter em uma string dentro de uma trigger? O problema está no fato
>>> de não saber a quantidade de campos (nem os tipos) que seriam
>>> concatenados, pois a idéia é concatenar qualquer linha de qualquer
>>> tabela. Gostaria de fazer isto sem ter que fazer selects em tabelas
>>> catalogs nem usar loops. Existe alguma função para fazer isso?
>>>
>>> So para informar, a idéia é poder registrar as alterações nas tabelas
>>> como um histórico simples, indicando o se foi insert, update ou
>>> delete. Estava pensando em aumentar o nivel do log do postgre mas acho
>>> que iria ficar muito pesado. Estou aceitando idéias também. Quem puder
>>> ajudar, obrigado
>> ...Gostaria de fazer isto sem ter que fazer selects em tabelas catalogs
>> nem usar loops...
>> qual o problema em fazer selects em catalogs ou loops?
>>
>> acho que vc está procurando alguma coisa +- pronta, é isso?
> 
> Isso mesmo. Queria alguma coisa tipo:
> CONCATENA_CAMPOS(new.*, ';');
> O retorno seria alguma coisa assim:
> '123;Campo1;Campo2;Campo3...'
> 
> A função está com esta estrutura:
> IF TG_OP = 'DELETE' THEN
>     INSERT INTO HISTORICO(Nome da tabela, Operacao, Dados) VALUES
> (TG_TABLE_NAME, 'D', CONCATENA_CAMPOS(old.*, ';'));
>     RETURN old;
> ELSIF TG_OP = 'INSERT' THEN
>     INSERT INTO HISTORICO(Nome da tabela, Operacao, Dados) VALUES
> (TG_TABLE_NAME, 'I', CONCATENA_CAMPOS(new.*, ';'));
>     RETURN new;
> ELSIF TG_OP = 'UPDATE' THEN
>     INSERT INTO HISTORICO(Nome da tabela, Operacao, Dados) VALUES
> (TG_TABLE_NAME, 'U', CONCATENA_CAMPOS(new.*, ';'));
>     RETURN new;
> END IF;
> 
> E existisse essa função "CONCATENA_CAMPOS" ajudaria bastante, mas se
> não der nenhum problema em utilizar outros selects e loops, beleza.
> 


Apenas para esclarecer: se sua tabela contém campos de diferentes 
tipos qual é a saida esperada por você?

Por exemplo: se existe um campo int4 com conteudo 3459(dec) você 
deseja em sua saida 00007AA3(hex) ou quer converter para um string?

Se desejar a saida em forma legível para os humanos você terá que 
formatar cada tipo de campo (date, float, bolean, timestamp etc) de 
seu registro. Veja:
http://www.postgresql.org/docs/current/interactive/functions-formatting.html

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

Responder a