Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

A.Aguiar

problemas com sequencia.

Recommended Posts

Criei uma sequencia e agora não estou conseguindo usala,

 

quando dou um

 

select ARQSTLO_STLOSEQU_SEQ.currval from dual

 

aparece a seguinte mensagem:

 

ORA-08002: sequence ARQSTLO_STLOSEQU_SEQ.CURRVAL is not yet defined in this session

 

tipo como eu faço para definir-la para a sessão atual..?

 

Grato a Todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você só vai conseguir dar este select depois de iniciar alguma transação.

 

Imagine uma tabela com codigo e descricao e usando teu sequencial.

Eu uso desta forma:

INSERT INTO tabela (codigo,descricao) VALUES (ARQSTLO_STLOSEQU_SEQ.nextval,'teste');

Aí sim você conseguirá ver qual é o valor corrente de teu sequencial, utilizando o select que você citou.

 

Se der um commit ou rollback não conseguirá mais ver o currval, pois a sessão estará encerrada.

Bom, talvez outra pessoa ou o alphamek possa te dar melhores explicações. Mas se fizer este teste que falei vai entender.

 

Caso troque o currval por nextval no select o valor do sequencial será incrementado novamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A.Aguiar,

 

Primeiramente, vou fazer alguns testes e acompanhe os resultados, tentei colocar todas as opções possiveis.

 

SQL*Plus: Release 10.2.0.1.0 - Production on Qui Dez 28 09:45:45 2006Copyright (c) 1982, 2005, Oracle.  All rights reserved.SQL> conn rodrigoalmeidaInforme a senha:SQL> create table X (a number(5), b varchar2(10));Tabela criada.SQL> create sequence SEQ_TESTE  2  increment by 1  3  start with 1  4  maxvalue 99999  5  nocycle;Sequência criada.SQL> select SEQ_TESTE.currval from dual;select SEQ_TESTE.currval from dual	   *ERRO na linha 1:ORA-08002: a sequência SEQ_TESTE.CURRVAL ainda não foi definido nesta sessãoSQL> l  1  declare  2	 contador integer;  3  begin  4	 contador := 1;  5	 while contador <= 5000 loop  6			 insert into X values (SEQ_TESTE.nextval,'TESTE');  7			 contador := contador + 1;  8	 end loop;  9  commit; 10* end;SQL> /Procedimento PL/SQL concluído com sucesso.SQL> select count(*) from X;  COUNT(*)----------	  5000SQL> select SEQ_TESTE.currval from dual;   CURRVAL----------	  5000SQL> select SEQ_TESTE.nextval from dual;   NEXTVAL----------	  5001SQL> drop sequence SEQ_TESTE;Sequência eliminada.SQL> select SEQ_TESTE.nextval from dual;select SEQ_TESTE.nextval from dual	   *ERRO na linha 1:ORA-02289: a sequência não existeSQL> create sequence SEQ_TESTE  2  increment by 1  3  start with 1  4  maxvalue 99999  5  nocycle;Sequência criada.SQL> select SEQ_TESTE.nextval from dual;   NEXTVAL----------		 1SQL> select SEQ_TESTE.currval from dual;   CURRVAL----------		 1SQL> l  1  declare  2	 contador integer;  3  begin  4	 contador := 1;  5	 while contador <= 1000 loop  6			 insert into X values (SEQ_TESTE.nextval,'TESTE 2');  7			 contador := contador + 1;  8	 end loop; 9* end;SQL> /Procedimento PL/SQL concluído com sucesso.SQL> select count(*) from X;  COUNT(*)----------	  6000SQL> select SEQ_TESTE.currval from dual;   CURRVAL----------	  1001SQL> select a, b  2  from X  3  where a <= 10  4  order by a;		 A B---------- ----------		 1 TESTE		 2 TESTE		 2 TESTE 2		 3 TESTE		 3 TESTE 2		 4 TESTE		 4 TESTE 2		 5 TESTE		 5 TESTE 2		 6 TESTE		 6 TESTE 2		 A B---------- ----------		 7 TESTE		 7 TESTE 2		 8 TESTE 2		 8 TESTE		 9 TESTE		 9 TESTE 2		10 TESTE 2		10 TESTE19 linhas selecionadas.SQL> rollback;Rollback concluído.SQL> select count(*) from X;  COUNT(*)----------	  5000SQL> select SEQ_TESTE.CURRVAL from dual;   CURRVAL----------	  1001

Agora vamos as explicações por partes:

 

1 - O erro que emitiu para você é devido sua sequência NÃO TER SIDO iniciada. Como pode ter analisada nas primeiras linhas. Após pegar o primeiro número gerado, o CURRVAL iria aparecer. Explicando mais resumido, seria assim:

 

- Você gerou a sequência iniciando com 1 (START WITH 1), porém não utilizou ela ainda, então que será o valor???? (Zero NÃO PODE), então é o motivo do erro.

- Após criarmos a sequência, exeuctei um NEXTVAL, "peguei um valor dele", aí sim, a partir de agora, TEMOS UM VALOR PARA CURRVAL.

 

2 - A sequência não depende da efetivação da transação, como ocorreu nos exemplos acima, devido a sequência ser um OBJETO que não dependo de dados transacionais dos usuários, ele apenas é um gerador númerio, então se uma TRANSAÇÃO pegou a valor 223 da sequência, JÁ ERA, caso ele dê um COMMIT ou ROLLBACK, esse valor na sequência foi para SACO!

 

Se outra transação pegar o valor 277, acontece a mesma coisa.

 

Dúvidas frequêntes:

 

Esses valores podem se repetir nas transações?

 

R: NÃO caso ele seja criado com NOCYCLE, ou SIM caso seja criado como CYCLE, quer dizer se meu MAXVALUE é 100, e meu valor está em 100, o próximo será 1, então irá ter a possibilidade de repetição númerica.

 

Caso use CACHE (VALOR), e minha base CRASH, pode perder a sequência númerica?

 

R: SIM, pois sempre os N próximos valores da sequência estarão em memória, e caso crash, nem RECOVERY EM TIME-POINT pode ajudar a resolver o problema, pois não estará em ARCHVIES ou arquivos de REDO, somente em memória. DICA: sempre construa utilizando NOCACHE.

 

BOM! Acho que me empolguei hoje. hehehehehehe Mais é isso aí.

 

O exemplo replica muitas dúvidas.

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/natal_tongue.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.