sql >> Databáze >  >> RDS >> Oracle

Jak získat aktuální hodnotu věštecké sekvence bez jejího zvýšení?

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

Z user_sequences můžete získat různá sekvenční metadata , all_sequences a dba_sequences .

Tato zobrazení fungují napříč relacemi.

UPRAVIT:

Pokud je sekvence ve vašem výchozím schématu, pak:

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

Pokud chcete všechna metadata, pak:

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

Doufám, že to pomůže...

EDIT2:

Dlouhý způsob, jak to udělat spolehlivěji, pokud velikost mezipaměti není 1, by byl:

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.

Jen si dejte pozor, pokud ostatní během této doby používají sekvenci - oni (nebo vy) mohou dostat

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

Můžete také chtít nastavit mezipaměť na NOCACHE před resetováním a poté zpět na původní hodnotu, abyste se ujistili, že jste do mezipaměti neuložili mnoho hodnot.



  1. MySQL COUNT DISTINCT

  2. Rozdělit oddíl na dva v SQL Server (T-SQL)

  3. Návrh databáze:jeden velký stůl nebo samostatné tabulky?

  4. SELECT / GROUP BY - časové úseky (10 sekund, 30 sekund atd.)