Re: [pgbr-geral] Concatenar vários campos com delimi tador
E existisse essa função CONCATENA_CAMPOS ajudaria bastante, mas se não der nenhum problema em utilizar outros selects e loops, beleza. Uma função como essa não teria como fugir dos LOOPS.. ! Crie-a... Com o script que eu enviei na minha primeira resposta não é necessario LER o catalogo, ela varre a ARRAY (NEW ou OLD) dinamicamente. -- Att: Thiago Risso ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Concatenar vários campos com delimi tador
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 7AA3(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
[pgbr-geral] Concatenar vários campos com delimi tador
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. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Concatenar vários campos com delimi tador
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? -- Esta mensagem foi verificada pelo sistema de Anti-virus da SJB Solados. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Concatenar vários campos com delimi tador
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. Em plperl sim .. : code my %newrow = %{$_TD-{new}}; while (($column,$value) = each %newrow) { $lineConcat.= $value.|; } /code -- Att: Thiago Risso ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Concatenar vários campos com delimi tador
Olá Yoshio, nós utilizamos Rules para registrar logs de update e delete nas tabelas. O insert fica valendo o próprio registro, se não existir log de update significa que o registro foi incluído da forma como está na tabela. As Rules são geradas durante o processo de atualização de versões (cria campos, tabelas, índices, triggers processo já discutido aqui). Sempre que atualizamos a versão do sistema, é rodado o processo que cria elas... Não sei se é a melhor maneira, mas preferimos Rules ao invés de Triggers para separar os logs das triggers... Abaixo um exemplo em uma tabela com dois campos. Att, Celso Lorenzetti. www.sysrs.com.br CREATE TABLE mercados ( mer_mercado numeric(5) NOT NULL, -- Código do mercado para vendas mer_nome character varying(50) NOT NULL, -- Nome do mercado para vendas CONSTRAINT pk_mercados PRIMARY KEY (mer_mercado) ) WITHOUT OIDS; CREATE OR REPLACE RULE mercados_d AS ON DELETE TO mercados DO INSERT INTO log (log_tabela, log_acao, usr_usuario, log_log) VALUES ('MERCADOS'::character varying, 'D'::character varying, fc_usuario(), ('[MER_MERCADO='::text || old.mer_mercado::text) || ']'::text); CREATE OR REPLACE RULE mercados_u AS ON UPDATE TO mercados DO INSERT INTO log (log_tabela, log_acao, usr_usuario, log_log) VALUES ('MERCADOS'::character varying, 'U'::character varying, fc_usuario(), (('[MER_MERCADO='::text || old.mer_mercado::text) || '] '::text) || CASE WHEN new.mer_nome::text old.mer_nome::text THEN ((('MER_NOME='::text || old.mer_nome::text) || '-'::text) || new.mer_nome::text) || ', '::text ELSE ''::text END); - Original Message - From: Yoshio [EMAIL PROTECTED] To: Comunidade PostgreSQL Brasileira pgbr-geral@listas.postgresql.org.br Sent: Monday, June 23, 2008 7:26 AM Subject: [pgbr-geral] Concatenar vários campos com delimitador 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. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral