[firebase-br] Execute statement em trigger???

Marcos Weimer marcosweimer em gmail.com
Qua Dez 22 17:08:54 -03 2010


O meu problema é que se for para passar como no seu caso new.cod_produto
teria de fazer campo a campo

veja a minha trigger toda...


AS
 DECLARE VARIABLE VAR_ID NUMERIC(18,0);
 DECLARE VARIABLE USER_NAME VARCHAR(31);
 DECLARE VARIABLE column_name varchar(31);
 declare variable comandosql varchar(5000);
 declare variable tmp varchar(2000);

BEGIN
  -- insere na tabela de colunas
  for
    select upper(trim(f.rdb$field_name)) --, fs.rdb$field_type --,
fs.rdb$field_length
    from rdb$relation_fields f
    left join rdb$fields fs on fs.rdb$field_name = f.rdb$field_source
    where f.rdb$relation_name = 'ESTOQUE_AJUSTES'
    order by f.rdb$field_position
  into :column_name
  do
  begin
    if (column_name <> 'DATA_CRIACAO_ALTERACAO') then
    begin
    comandosql = 'execute procedure P_INSERT_LOG_COLUNA(' ||:VAR_ID ||', '''
|| :column_name ||''' , null, new.' || :column_name || ');';
    execute statement comandosql;
  end
end
END

a ideia desse for é evitar de fazer 26 linhas

execute procedure P_INSERT_LOG_COLUNA(:VAR_ID , 'CODFILIAL'', null,
new.CODFILIAL');
execute procedure P_INSERT_LOG_COLUNA(:VAR_ID , 'AJUSTE_ID'', null,
new.AJUSTE_ID');

desta forma funciona, agora imagina isso em 639 tabelas com seus inumeros
campos.

por isto queria fazer com o FOR onde o COLUMN_NAME é uma variavel que recebe
o nome do campo.


Aguardando sugestões...


Em 22 de dezembro de 2010 16:52, Pedro Braga <bragaped em gmail.com> escreveu:

> Utilizo Sempre Dessa Forma e Nunca tive Problema.
>
> sql = 'update grade_prod g set g.estoque = (coalesce(g.estoque,0)) +
> ('||new.quantidade||'), EGRA'||new.index_grade||' =
> (coalesce(EGRA'||new.index_grade||',0)) + ('||new.quantidade||') '||
>              'where g.cod_interno = '||new.cod_interno||' and g.cod_empresa
> = '||new.cod_empresa||' and g.cod_prod='||new.cod_produto||';';
>        EXECUTE STATEMENT :sql;
>
> o problema Ocorre pois o Execute Statement Executa o Comando Diretamente e
> não tem como passar um new.Campo voce precisa passar o Valor Diretamente.
>
>
>
>
> Em 22 de dezembro de 2010 16:32, Marcos Weimer <marcosweimer em gmail.com
> >escreveu:
>
> > Boa Tarde
> >
> > Tenho uma trigger para fazer um LOG em uma tabela, essa trigger faz um
> for
> > select nos campos e executa o codigo abaixo...
> >
> >
> >    if (column_name <> 'DATA_CRIACAO_ALTERACAO') then
> >    begin
> >      comandosql = 'execute procedure P_INSERT_LOG_COLUNA(' ||:VAR_ID ||',
> > ''' || :column_name ||''' , null, new.' || :column_name || ');';
> >      execute statement comandosql;
> >    end
> >
> > este execute statement sempre vi em procedures e tal... nunca vi em
> > trigger...
> > nesse caso se gero um exception o comandosql aparece ok (execute
> procedure
> > P_INSERT_LOG_COLUNA(1,'CODFILIAL',null,new.CODFILIAL))
> >
> > o problema que com o execute statemente ele deixa de reconhecer o
> > new.CODFILIAL (Dynamic SQL Error /  SQL error code = -206 / Column
> unknown
> > /
> > new.CODFILIAL)
> >
> > Alguem ja usou o execute statement em trigger???
> >
> > Minha ideia é fazer usando o execute statemente para não ficar uma
> trigger
> > gigante com varias linhas "repetidas" (1 linha para cada campo)
> >
> >
> > Desde ja. Obrigado.
> >
> >
> >
> > --
> > -=Ma®©oS=-
> > Marcos R. Weimer
> > Puma GTE 1974 Tubarão
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > http://www.firebase.com.br/fb/artigo.php?id=1107
> > Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> >
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



-- 
-=Ma®©oS=-
Marcos R. Weimer
Puma GTE 1974 Tubarão



Mais detalhes sobre a lista de discussão lista