Sem muita análise de minha parte aqui, mas ** acho ** que o RETURNING na 
trigger da tabela-pai só serviria se a própria trigger na tabela-pai é que 
fosse inserir os registros-filhos, pois o RETURNING devolve o valor usado pra 
uma variável local de quem fez o INSERT....
   Só se vc estava pensando em, no próprio programa/rotina cliente que envia o 
INSERT para o banco de dados, ter o INSERT... RETURNING retornando o valor para 
uma variável local dele, que aí essa variável pode ser usada no INSERT da 
tabela-fillha, supondo que é esse mesmo programa/rotina cliente que vai inserir 
na tabela-filha.... Aí sim, é possível...
   
   Se não é isso que vai acontecer (por exemplo, N programas/rotinas diferentes 
podem enviar INSERTs na tabela-pai, e não é possível/viável os alterar a todos 
para usar o RETURNING, digamos, o que também Invalida a opção de se ter uma API 
única - uma function ou procedure, digamos - que faz o INSERT ) e portanto a 
lógica precisa ser implementada com triggers, e triggers Separadas, penso que :
   
   a) já que deve haver uma constraint de PK/FK nas tabelas, Imagino que a 
tabela-pai TEM que ser inserida em primeiro lugar... SE for a mesma sessão de 
banco que inseriu o registro PK que é quem vai mandar pro banco os INSERTs dos 
registros FKs, para vc ter um valor GLOBAL na sessão se poderia ter um CONTEXT, 
e/ou uma variável global, e/ou uma GTT , aí a trigger na pai poderia popular 
qualquer uma dessas opções com os valor que foi usado no INSERT, e a trigger na 
tabela-fila os recuperaria de lá
   
   Se não for isso, se for sessões/conexões DIFERENTES que vão fazer o INSERT 
na tabela-filha (absolutamente NÃO é incomum : um Pool de Conexão, por exemplo, 
tipicamente atende cada SQL numa sessão/conexão diferente, por exemplo), aí as 
opções são mais restritas para que a trigger na tabela-pai consiga guardar um 
valor que a outra sessão possa enxergar - tem que ser algo a nível de database 
(um context GLOBAL, uma tabela heap/comum que é inserida e comitada via 
autonomous transaction, algo assim), ou então algo FORA do database (tipo um 
arquivo-texto acessado via EXTERNAL TABLE)....
   
    []s
        
          Chiappa
          

--- Em oracle_br@yahoogrupos.com.br, "Zilmar Furquim"  escreveu
>
> Concordo com tudo que foi dito sobre a serialização e utilização das 
> variaveis :NEW, mas pelo que entendi esse trigger seria da TABELA PAI e a 
> necessidade é GUARDAR O ID gerado pela trigger para utiliza-lo em um insert 
> posterior na tabela filha.
> 
> Emerson, além de considerar as observações feitas, sugiro que utilize o 
> INSERT RETURNING conforme já indiquei na minha mensagem anterior.
> 
> Veja um exemplo bem parecido com o seu caso em 
> http://www.adp-gmbh.ch/ora/sql/insert_into_x_returning_y.html
> 
> Abs,
> Zilmar Furquim
> 
> --- Em oracle_br@yahoogrupos.com.br, "J. Laurindo Chiappa"  escreveu
> >
> >   Olhando rapidamente eu não tinha visto mas se tem, okdoc : fica mais 
> > ininteligível ainda o fato dele não estar populando o regtype :NEW com os 
> > valores que quer.... 
> >   
> >     []s
> >     
> >       Chiappa
> > 
> > --- Em oracle_br@yahoogrupos.com.br, "Milton Bastos Henriquis Jr."  escreveu
> > >
> > > Mas no código dele aqui do e-mail tem sim o "FOR EACH ROW"...
> > > 
> > > 
> > > 
> > > 2013/2/14 J. Laurindo Chiappa 
> > > 
> > > > **
> > > >
> > > >
> > > > Não só isso, Milton : para que vc possa ter acesso às rowtypes :NEW e
> > > > :OLD, não esqueçamos que é Exigido que a trigger seja do tipo FOR EACH 
> > > > ROW,
> > > > o que não acontece no caso em questão...
> > > > Emerson , além da questão acima, pelo que vejo vc está programando em 
> > > > modo
> > > > MONO-USUÁRIO : o que acontece se duas sessões forem fazer INSERT ao 
> > > > mesmo
> > > > tempo nessa tabela, vc pensou nisso ???? Me parece que não, pois Não 
> > > > Vejo
> > > > nenhum tipo de LOCK aí para serializar o acesso, então há SIM chances de
> > > > duas sessões obterem o mesmo valor, sim ??? E se o sujeito pedir um
> > > > ROLLBACK na sessão, a tua lógica não me parece estar preparada para
> > > > desfazer a seleção na tabela de valores...
> > > > No instante em que vc , por necessidade inadiável ou não, se põe a 
> > > > simular
> > > > uma SEQUENCE, faça-o DE MODO COMPLETO, serializando, controlando a
> > > > transação, sim ?
> > > >
> > > > []s
> > > >
> > > > Chiappa
> > > >
> > > > OBS : nem entro no mérito nas questões de PERFORMANCE, INTEGRIDADE DE
> > > > DADOS e SEGURANÇA : é óbvio que um código seu, interpretado, não vai
> > > > conseguir facilmente competir em nenhum desses quesitos com o código em 
> > > > C
> > > > nativo no RDBMS para as sequences....
> > > >
> > > > --- Em oracle_br@yahoogrupos.com.br, "Milton Bastos Henriquis Jr."
> > > > escreveu
> > > >
> > > > >
> > > > > A Trigger é de before insert, nessa tal tabela filha que vc mencionou,
> > > > > correto?
> > > > >
> > > > > Basta fazer o campo (:new.nomedocampo) receber o valor dessa tal 
> > > > > variável
> > > > > (vc falou V_SEQ, mas essa variavel não existe na trigger... não seria
> > > > > G_SEQ?).
> > > > >
> > > > >
> > > > >
> > > > > On Thu, Feb 14, 2013 at 2:46 PM, emerson_sanches
> > > > > wrote:
> > > > >
> > > > > > **
> > > >
> > > > > >
> > > > > >
> > > > > > Boa tarde pessoal da lista. Desenvolvi uma trigger para gerar um
> > > > numero de
> > > > > > id de uma tabela mestre. segue a mesma:
> > > > > >
> > > > > > CREATE OR REPLACE TRIGGER SGI5_TRG_REC_TM1_SEQ
> > > > > > BEFORE INSERT ON SGI5_TAB_REC_TM1
> > > > > > FOR EACH ROW
> > > > > > DECLARE
> > > > > > G_SEQ NUMBER;
> > > > > >
> > > > > > CURSOR C_SEQ IS
> > > > > > SELECT CASE
> > > > > > WHEN NVL(MAX(A.NR_DOCTO),0) < 700000000 THEN 700000000
> > > > > > ELSE
> > > > > > NVL(MAX(A.NR_DOCTO),0) + 1
> > > > > > END SEQ
> > > > > > FROM EPMV A;
> > > > > >
> > > > > > BEGIN
> > > > > > IF :NEW.TM1_NRM IS NULL THEN
> > > > > > OPEN C_SEQ;
> > > > > > FETCH C_SEQ INTO G_SEQ;
> > > > > > CLOSE C_SEQ;
> > > > > >
> > > > > > :NEW.TM1_NRM:= G_SEQ;
> > > > > > END IF;
> > > > > > END;
> > > > > >
> > > > > > Sei que alguns irão me dizer pra usar sequence, mas nesse caso,
> > > > > > infelizmente não posso.
> > > > > > O problema eh que preciso conseguir pegar o valor gerado na variável
> > > > V_SEQ
> > > > > > para fazer inserção na tabela filha.
> > > > > > Como faço isso?
> > > > > >
> > > > > > Obrigado pela atenção.
> > > > > >
> > > > > > Emerson
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > > > [As partes desta mensagem que não continham texto foram removidas]
> > > > >
> > > >
> > > >  
> > > >
> > > 
> > > 
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> >
>


Responder a