Oracle
 sql >> Database >  >> RDS >> Oracle

Come recuperare il valore corrente di una sequenza di oracoli senza incrementarlo?

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

Puoi ottenere una varietà di metadati di sequenza da user_sequences , all_sequences e dba_sequences .

Queste visualizzazioni funzionano tra le sessioni.

MODIFICA:

Se la sequenza è nello schema predefinito, allora:

SELECT last_number
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

Se vuoi tutti i metadati allora:

SELECT *
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

Spero che aiuti...

EDIT2:

Un modo lungo per farlo in modo più affidabile se la dimensione della cache non è 1 sarebbe:

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.

Fai solo attenzione che se altri stanno usando la sequenza durante questo periodo, loro (o tu) potrebbero ottenere

ORA-08004: sequence SEQ.NEXTVAL goes below the sequences MINVALUE and cannot be instantiated

Inoltre, potresti voler impostare la cache su NOCACHE prima del ripristino e poi di nuovo al suo valore originale in seguito per assicurarti di non aver memorizzato molti valori nella cache.