A.Aguiar 0 Denunciar post Postado Dezembro 27, 2006 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
walace 1 Denunciar post Postado Dezembro 27, 2006 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
alphamek 2 Denunciar post Postado Dezembro 28, 2006 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