Re: [pgbr-geral] Concatenar vários campos com delimi tador

2008-06-24 Por tôpico Thiago Risso

 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

2008-06-24 Por tôpico Osvaldo Rosario Kussama
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

2008-06-23 Por tôpico Yoshio
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

2008-06-23 Por tôpico Emerson Casas Salvador
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

2008-06-23 Por tôpico Thiago Risso
 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

2008-06-23 Por tôpico Celso
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