sql >> Databasteknik >  >> RDS >> Oracle

Hur hämtar man det aktuella värdet av en orakelsekvens utan att öka den?

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

Du kan få en mängd olika sekvensmetadata från user_sequences , all_sequences och dba_sequences .

Dessa vyer fungerar över sessioner.

EDIT:

Om sekvensen finns i ditt standardschema:

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

Om du vill ha all metadata:

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

Hoppas det hjälper...

EDIT2:

Ett långrandigt sätt att göra det mer tillförlitligt om din cachestorlek inte är 1 skulle vara:

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.

Var bara uppmärksam på att om andra använder sekvensen under denna tid - kan de (eller du) få

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

Du kanske också vill ställa in cachen till NOCACHE före återställningen och sedan tillbaka till sitt ursprungliga värde efteråt för att se till att du inte har cachat många värden.



  1. SLIPP TABELL OM FINNS i SQLite

  2. WhoIsActive Runner

  3. Hur man inaktiverar alla CHECK &främmande nyckelbegränsningar för en tabell i SQL Server (T-SQL-exempel)

  4. Vad är fördelen med zerofill i MySQL?