Veja bem, Emerson : lendo as msgs que estamos trocando nesta thread, eu ** imagino ** que já "caiu a ficha" aí para vc que *** NÃO É ** algo extremamente Simples vc fazer ** DIREITO ** a simulação de uma sequence : normalmente isso implica, além de código extra nas triggers para obter o valor, , em criação de objetos para se guardar o tal valor sequencial (e também alguma informação extra eventualmente necessária), em código para SERIALIZAR o acesso (vc NÂO TEM o direito de supor que não vai haver acesso concorrente sem PROVAS sérias, sem alguma Regra de Negócio fortemente estabelecida).... imho é um trabalho ** BESTIAL ** para se ganhar como recompensa o "contentamento" do pessoal - não é razão de se deixar de usar o procedimento Correto, Seguro, Fácil e Nativo de seja o que for só porque "pessoal não gosta" ... ==> SE sabendo de tudo isso ainda assim vc quer seguir esse caminho, nos diga detalhadamente : a) o que vc quer que aconteça quando haver um rollback : exemplo, um usuário A fez o INSERT e ganhou um ID 45 ** mas ** ainda não gravou a tela, nesse intervalo um usuário B também pediu um INSERT, ganhou um ID 46, e aí A pede um rollback (fechamdo a tela da aplicação sem gravar, digamos), e B comitou . É preciso que B grave o valor 45 ao invés de 46, ou não ? b) é viável a SERIALIZAÇÃO simples (ie, assim que um usuário pede um INSERT já é feito um LOCK no objeto que guarda o último ID, e só quando esse usuário comitar/gravar é que outros poderão fazer INSERTs ? c) é viável se ter uma API (ie, uma procedure/function/package) que faz os INSERTs , ao invés do próprio aplicativo enviar os comandos INSERTs para o database ? d) o seu sistema usa conexão dedicada , ou mts/shared ? tem pool de conexão na jogada , ou a mesma sessão que conectou originalmente no banco segue até o final enviando os SQLs todos ? e) a versão/Edição ** EXATAS ** do database, para nós sabermos quais recursos podemos usar Com essa info, a gente pode PALPITAR em cima : eu digo PALPITAR porque com certeza o que vc vai obter é uma POC, uma prova de Conceito, absolutamente NÂO È uma "consultoria", uma solução mastigada, otimizada e 100% segura e pronta, okdoc ? []s Chiappa
--- Em oracle_br@yahoogrupos.com.br, "emerson_sanches" escreveu > > Pessoal, obrigado por todas as respostas. > Eu sei pessoal, a sequence eh mais eficiente, mais rapida, mais > segura......sei de tudo isso, mas o pessoal aqui nao gosta de numeros pulados > na sequencia dos codigos. > Com relação a concorencia das tabelas, o numero de usuarios utilizando ao > mesmo tempo eh pequeno, sendo que acredito que nao terei problemas. > Mas seguindo a linha de raciocio do Chiappa, acho interessante fazer a > simulação completa de uma sequence, mas nao sei como fazer. Será que a turma > nao poderia me dar uma ajuda? > > Obrigado de novo. > > Emerson > > --- Em oracle_br@yahoogrupos.com.br, "Marlon Pasquali - TI - Peccin S.A" > escreveu > > > > Emerson, > > Em minha opinião: > > - Crie uma sequence. (sim...é mais eficiente e segura) > > - faça o incremento da sequence para sua variável ( Select > > sequence.NEXTVAL into G_SEQ from dual;) > > - atribua o G_SEQ na sua tabela (:NEW.TM1_NRM:= G_SEQ;) > > - a tabela filho que você se refere , não é esta mesma ? . Então faça um > > insert nela neste mesmo momento usando a sua mesma variável G_SEQ > > > > Marlon > > > > > > > > > > > > -----Mensagem original----- > > De: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] Em > > nome de Milton Bastos Henriquis Jr. > > Enviada em: quinta-feira, 14 de fevereiro de 2013 14:56 > > Para: oracle_br@yahoogrupos.com.br > > Assunto: Re: [oracle_br] Retorno de Trigger > > > > 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] > > > > > > > > ------------------------------------ > > > > ---------------------------------------------------------------------------- > > ---------------------------------------------- > > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira > > responsabilidade de seus remetentes. > > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ > > ---------------------------------------------------------------------------- > > ---------------------------------------------- > > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » > > >Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO > > >ESPAÇO! VISITE: http://www.oraclebr.com.br/ > > ---------------------------------------------------------------------------- > > -------------------------------------------- Links do Yahoo! Grupos > > >