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

Isael Faria Junior isael em stetika.com.br
Qua Dez 22 17:27:49 -03 2010


  faça um for na estrutura da tabela
select f.rdb$field_name
from rdb$relation_fields f
join rdb$relations r on f.rdb$relation_name = r.rdb$relation_name
and r.rdb$view_blr is null
and (r.rdb$system_flag is null or r.rdb$system_flag = 0)
and f.rdb$relation_name = :V_TABELA
order by 1, f.rdb$field_position

e monte a string dinamicamente.


Em 22/12/2010 17:08, Marcos Weimer escreveu:
> 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
>>
>
>

-- 
ISAEL FARIA JUNIOR
PABX : (19) 3203 – 0340   FAX  : (19) 3203 - 0343
CELULAR :  (19) 9198 - 6729
email :    isael em stetika.com.br	

Stetika Informática Ltda
Rua José Paulino 320 Sala 51
Edifício Century Tower
Centro - Campinas - SP
CEP - 13013-000





Mais detalhes sobre a lista de discussão lista