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

Responder a