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


Responder a