[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