: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
  

Mensagemem Ter, 08 Nov 2005 9:36 am

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 ?
Zida
Localização: Toledo - PR

Mensagemem Qua, 09 Nov 2005 9:29 am

Certa vez eu tive que fazer chamadas dessa forma para várias tabelas. Já que ele não permite que seja feito o
Código: Selecionar todos
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. :-(
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Qua, 09 Nov 2005 7:49 pm

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
Zida
Localização: Toledo - PR

Mensagemem Qui, 10 Nov 2005 8:51 am

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 ?

Código: Selecionar todos
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>
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Qui, 10 Nov 2005 10:47 am

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
Zida
Localização: Toledo - PR

Mensagemem Ter, 15 Nov 2005 10:41 pm

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/audit-trail-soluo-caseira.html
mportes
Localização: São Paulo


Mensagemem Qua, 16 Nov 2005 6:27 am

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 também me passou isso.
Vamos ver o que vou fazer, vou dar uma olhada melhor nas coisas ...

Muito obrigado pela sua atenção.
Abracos
Zida
Localização: Toledo - PR

Mensagemem Qui, 17 Nov 2005 7:38 pm

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.
mportes
Localização: São Paulo



  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


Voltar para PL/SQL

Quem está online

Usuários navegando neste fórum: Bing [Bot] e 4 visitantes