:NEW ou :OLD em triggers usando EXECUTE IMMEDIATE

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Zida
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 53
Registrado em: Ter, 08 Jun 2004 2:59 pm
Localização: Toledo - PR

Bom dia pessoal, estou passando por um problema, se alguém pudesse me ajudar...

Estou criando um gatilho que pega as colunas da tabela de forma automatica, verifica se é inserção ou update, monta a query, e em seguida da um execute immediate, porem, aparece a mensagem de que "nem todas as variaveis estao limitadas'.

Eu faco um select na tabela all_tab_columns, e pego as colunas:
colunas := i.column_name;
e já pego os valores:
col_dados := ':NEW.'||i.column_name;
e é por isso que tenho essa mensagem de erro. Mas não consegui achar uma forma para fazer funcinar.

alguém sabe de alguma coisa para contornar isso ?
algo do tipo name_in que existe no forms ou algo parecido ?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Certa vez eu tive que fazer chamadas dessa forma para várias tabelas. Já que ele não permite que seja feito o

Selecionar tudo

 variavel := ':NEW'|| vcampo;
Eu criei uma rotina que GERA todo select, pra cada tabela que eu queria. Daí eu só aplicava esse select gerado na trigger. Ou seja, só fiz um "facilitador" pra não precisar digitar cada sql.

Infelizmente, não conheço uma forma de se fazer dinamicamente isso que você quer. :-(
Zida
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 53
Registrado em: Ter, 08 Jun 2004 2:59 pm
Localização: Toledo - PR

Boa noite Dr Gori ..
então ...

eu estava precisnado fazer algo dinamico e generico, pra prevenir alteracoes na estrutura da tabela.

Mas em gatilho não vejo uma forma de pegar o valor que esta sendo inserido ou atualizado...
Apenas consigo pegar os dados usando a referencia :new.campo ... mas pra isso eu iria ter que deixar estatico ... e não é bem isso o que gostaria ...

:(

você poderia colar um pedaco do seu codigo para eu dar uma olhada... vai q derepente me vem uma Luz :roll: :)

muito obrigado pelo seu interesse
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Infelizmente, não tenho a rotina aqui.
Mas basicamente, ela gerava os selects estáticos e eu só aplicava na trigger.
Ou seja, eu tinha uma rotina que criava o select que eu queria. Buscava os campos na USER_TAB_COLUMNS e criava o sql como eu queria. (apenas pra eu não precisar criar manualmente cada select pra cada tabela)

Entendeu ?

Selecionar tudo

SQL> select ', :new.'||COLUMN_NAME
  2  from user_tab_columns
  3  where table_name = 'APLICATIVOS'
  4  /

',:NEW.'||COLUMN_NAME
-------------------------------------
, :new.CODIGO
, :new.DESCRICAO
, :new.TIPO
, :new.ICONE

SQL> 
Zida
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 53
Registrado em: Ter, 08 Jun 2004 2:59 pm
Localização: Toledo - PR

Bom dia Dr. Gori
Entendi sim ...

muito obrigado por sua ajuda ...

vou fazer mais alguns testes, se eu achar algo lhe aviso ...


muito obrigado

Abraços
mportes
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Ter, 01 Nov 2005 11:53 pm
Localização: São Paulo
Contato:

Zida, você poderia explicar melhor o que você tem que fazer, ainda não entendi. Se você está procurando auditoria, eu tenho um exemplo no meu blog, mas não sei se é isso que você precisa.

http://mportes.blogspot.com/2005/05/aud ... seira.html
Zida
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 53
Registrado em: Ter, 08 Jun 2004 2:59 pm
Localização: Toledo - PR

Estou criando gatilhos que pegarao os dados de uma tabela origem, e joagarao numa tabela espelho com os mesmos campos, porem, com alguns campos a mais para controle. Estou fazendo isso para fazer um projeto de exportação de dados do nosso sistema, que devera alimentar um outro sistema para se obeter informações gerenciais e estatisticas.
Porem, não gostaria de ficar amarrado e sempre quando a estrutura (colunas) das tabelas mudarem, eu ter que editar gatilho por gatilho na mão.
Eu já havia visto o seu exemplo numa outra pagina, não lembro qual, e a gente já usa esse esquema de criar os gatilhos, mas para esse caso não daria certo. Gostaria que fosse mais dinamico ...
Porque senao sempre que mudarem ou eu mudar a tabela, terei que rodar manualmente um primeiro script que cria o gatilho, a não ser que existe algum modo de pegar quando uma tabela foi alterada, dai posso deixar um JOB no banco e boa ...
Mas pelo que vi, esse é o modo mais "facil" e o Dr.Gori tb me passou isso.
Vamos ver o que vou fazer, vou dar uma olhada melhor nas coisas ...

Muito obrigado pela sua atenção.
Abracos
mportes
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Ter, 01 Nov 2005 11:53 pm
Localização: São Paulo
Contato:

os campos de controle são fixos?
Porque se forem, você poderia guardar somente um ponteiro para a tabela real, nesse caso não importaria quanto ela mude, você teria como chegar aos dados de forma segura e os campos complementares estariam lá.
Acho que é mais um caso de projeto que solução técnica.

Me desculpe por não poder ajudar mais.
Responder
  • Informação