Caro Claudio, bom dia! Ja fiz isso, inclusive criei uma view especificamente para isso, mas como a tabela e muito grande, a performance fica muito melhor em uma tabela separada (efetuei varios testes), que ja e um agrupamento da tabela original e por isso mesmo com menos dados. Sds Paulo
-----Mensagem original----- De: Claudio Oliveira [mailto:[EMAIL PROTECTED] Enviada em: sexta-feira, 27 de janeiro de 2006 19:38 Para: [EMAIL PROTECTED]; [email protected] Assunto: RE: [PostgreSQL-Brasil] STORED PROCEDURES - TRIGGERS pq vc naum usa uma tabela só, e depois extrai os dados da tabela tbl_dataliner com um "select group by" vc ja tentou ? >From: "Paulo Rogerio Zimolo" <[EMAIL PROTECTED]> >Reply-To: [EMAIL PROTECTED], [email protected] >To: <[email protected]> >Subject: [PostgreSQL-Brasil] STORED PROCEDURES - TRIGGERS >Date: Fri, 27 Jan 2006 16:36:23 -0200 > >Senhores, >Tenho duas tabelas, tbl_dataliner e tbl_dataliner_total, sendo que a >segunda >consiste em um agrupamento de alguns dados da primeira. >Como semanalmente tenho que inserir dados na tbl_dataliner (aprox 30000 >registros), criei as triggers abaixo para que depois de inserir os dados na >tbl_dataliner, os dados da tbl_dataliner_total sejam deletados, para que em >seguida seja refeito o agrupamento dos dados da tabela tbl_dataliner para a >tabela tbl_dataliner _total (ja incluindo os novos dados). >Ocorre que as funcoes nao estao funcionando corretamente. >Nao sei se estou fazendo do jeito certo, portanto se alguem conhecer alguma >forma de fazer com que a funcao seja chamada apenas uma vez (pelo select) e >nao por cada entrada, ou mesmo se puder dizer onde estou errando, eu >agradeceria muito. >Atenciosamente >Paulo > > 1) create trigger exc_dataliner_total after insert on tbl_dataliner for >each statement execute procedure fexc_dataliner_total(); > > 2) CREATE OR REPLACE FUNCTION fexc_dataliner_total() returns trigger as > ' > BEGIN > > DELETE from tbl_dataliner_total; > RETURN OLD; > > END; > ' > LANGUAGE 'PLPGSQL'; > > > > 3)create trigger ins_dataliner_total after delete on tbl_dataliner_total >for each statement execute procedure fins_dataliner_total(); > > > > 4)CREATE OR REPLACE FUNCTION fins_dataliner_total() returns trigger as > ' > DECLARE > reg RECORD; > > BEGIN > if tg_op = ''INSERT'' then > FOR reg IN SELECT fk_lporto, fk_cliente, fk_carrier, commodity, >fk_odporto, fk_direction, fk_month, year, SUM(teu)::INT AS teu FROM >tbl_dataliner GROUP BY fk_lporto, fk_cliente, fk_carrier, commodity, >fk_odporto, fk_direction, fk_month, year > > LOOP > > INSERT INTO tbl_dataliner_total (fk_lporto, fk_cliente, fk_carrier, >commodity, fk_odporto, fk_direction, fk_month, year, teu) > > VALUES (reg.fk_lporto, reg.fk_cliente, reg.fk_carrier, reg.commodity, >reg.fk_odporto, reg.fk_direction, reg.fk_month, reg.year, reg.teu); > > END LOOP; > END if; > return reg; > END; > ' > LANGUAGE 'PLPGSQL'; > > >_______________________________________________ >Grupo de Usuários do PostgreSQL no Brasil >http://www.postgresql.org.br _________________________________________________________________ Ligações gratuitas de PC-para-PC para qualquer lugar do Brasil e do mundo com o MSN Messenger. Saiba mais em http://imagine-msn.com/messenger/default2.aspx?locale=pt-br _______________________________________________ Grupo de Usuários do PostgreSQL no Brasil http://www.postgresql.org.br
