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] > > > > > >