Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como recuperar o valor atual de uma sequência oracle sem incrementá-lo?

SELECT last_number
  FROM all_sequences
 WHERE sequence_owner = '<sequence owner>'
   AND sequence_name = '<sequence_name>';

Você pode obter uma variedade de metadados de sequência de user_sequences , all_sequences e dba_sequences .

Essas visualizações funcionam em todas as sessões.

EDITAR:

Se a sequência estiver em seu esquema padrão, então:
SELECT last_number
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

Se você quiser todos os metadados, então:
SELECT *
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

Espero que ajude...

EDIT2:

Uma maneira prolixa de fazer isso de forma mais confiável se o tamanho do seu cache não for 1 seria:
SELECT increment_by I
  FROM user_sequences
 WHERE sequence_name = 'SEQ';

      I
-------
      1

SELECT seq.nextval S
  FROM dual;

      S
-------
   1234

-- Set the sequence to decrement by 
-- the same as its original increment
ALTER SEQUENCE seq 
INCREMENT BY -1;

Sequence altered.

SELECT seq.nextval S
  FROM dual;

      S
-------
   1233

-- Reset the sequence to its original increment
ALTER SEQUENCE seq 
INCREMENT BY 1;

Sequence altered.

Apenas tome cuidado para que, se outros estiverem usando a sequência durante esse período - eles (ou você) podem ficar
ORA-08004: sequence SEQ.NEXTVAL goes below the sequences MINVALUE and cannot be instantiated

Além disso, você pode querer definir o cache para NOCACHE antes da redefinição e depois de volta ao seu valor original para garantir que você não armazenou muitos valores em cache.