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