Existe uma instrução SQL para recuperar o valor de uma sequência que não a incrementa.
Obrigado.
EDIÇÃO E CONCLUSÃO
Conforme declarado por Justin Cave Não é útil tentar "salvar" o número da sequência para
select a_seq.nextval from dual;
é bom o suficiente para verificar um valor de sequência.
Ainda mantenho a resposta de Ollie como boa porque ela respondeu à pergunta inicial. mas pergunte a si mesmo sobre a necessidade de não modificar a sequência, se você quiser fazê-lo.
nextval
testar a sequência? Você não está assumindo que as sequências serão livres de falhas, certo? Portanto, "desperdiçar" um valor de sequência não deve ser um problema.Respostas:
Você pode obter vários metadados de sequência de
user_sequences
,all_sequences
edba_sequences
.Essas visualizações funcionam em todas as sessões.
EDITAR:
Se a sequência estiver no seu esquema padrão, então:
Se você deseja todos os metadados, então:
Espero que ajude...
EDIT2:
Uma maneira prolongada de fazê-lo de maneira mais confiável se o tamanho do cache não for 1 seria:
Apenas tome cuidado para que, se outras pessoas estiverem usando a sequência durante esse período - elas (ou você)
Além disso, convém definir o cache como
NOCACHE
anterior à redefinição e depois retornar ao seu valor original posteriormente para garantir que você não tenha armazenado muitos valores em cache.fonte
ALL_SEQUENCES
é uma visão. Se você não tiver acesso a ele, tente selecionarUSER_SEQUENCES
se a sequência está no seu esquema padrão. (Você não precisará dasequence_owner = '<sequence_owner>'
cláusula paraUSER_SEQUENCES
).LAST_NUMBER
inALL_SEQUENCES
não será o último número que uma sessão foi realmente fornecida e não será o número que seria retornado de uma chamada parasequence_name.nextval
em geral. Supondo que você configurou a sequência paraCACHE
mais de 1 (o padrão é 20),LAST_NUMBER
será o último número que está no cache. Não há garantia de que esse número seja realmente fornecido a qualquer sessão.ALTER SEQUENCE seq INCREMENT BY -1;
será um problema, a menos que se possa garantir que nenhuma outra sessão será chamadaseq.nextval
. Caso contrário, a sequência estará distribuindo valores duplicados, o que geralmente não é o que se deseja.select MY_SEQ_NAME.currval from DUAL;
Lembre-se de que só funciona se você executou
select MY_SEQ_NAME.nextval from DUAL;
nas sessões atuais.fonte
Minha resposta original estava incorreta e estou feliz por ter sido removida. O código abaixo funcionará nas seguintes condições: a) você sabe que ninguém mais modificou a sequência; b) a sequência foi modificada pela sua sessão. No meu caso, encontrei um problema semelhante no qual estava chamando um procedimento que modifica um valor e estou confiante de que a suposição é verdadeira.
Infelizmente, se você não modificou a sequência em sua sessão, acredito que outras pessoas estejam corretas ao afirmar que o NEXTVAL é o único caminho a percorrer.
fonte
Esta não é uma resposta, na verdade e eu a teria inserido como um comentário se a pergunta não tivesse sido bloqueada. Isso responde à pergunta:
Porque você deveria querer isso?
Suponha que você tenha uma tabela com a sequência como chave primária e a sequência seja gerada por um gatilho de inserção. Se você quiser ter a sequência disponível para atualizações subseqüentes no registro, precisará de uma maneira de extrair esse valor.
Para garantir que você obtenha a correta, você pode agrupar a consulta INSERT e RonK em uma transação.
Consulta de RonK:
No cenário acima, a ressalva de RonK não se aplica, pois a inserção e a atualização aconteceriam na mesma sessão.
fonte
Também tentei usar CURRVAL, no meu caso, para descobrir se algum processo inseriu novas linhas em alguma tabela com essa sequência como Chave Primária. Minha suposição era que CURRVAL seria o método mais rápido. Mas a) CurrVal não funciona, ele apenas obterá o valor antigo porque você está em outra sessão do Oracle, até fazer um NEXTVAL em sua própria sessão. E b) a
select max(PK) from TheTable
também é muito rápido, provavelmente porque uma PK é sempre indexada. Ouselect count(*) from TheTable
. Ainda estou experimentando, mas os dois SELECTs parecem rápidos.Não me importo com uma lacuna na sequência, mas no meu caso eu estava pensando muito em pesquisar, e odiaria a ideia de lacunas muito grandes. Especialmente se um simples SELECT fosse tão rápido.
Conclusão:
fonte