[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