sql - 如何在不增加 Oracle 序列的情况下检索其当前值?

标签 sql oracle sequence

是否有一条 SQL 指令来检索不递增序列的值。

谢谢。

编辑和结论

正如 Justin Cave 所说,尝试“保存”序列号是没有用的

select a_seq.nextval from dual;

足以检查序列值。

我仍然保留 Ollie 的答案为好答案,因为它回答了最初的问题。但如果你想这样做的话,问问自己是否有必要不修改序列。

最佳答案

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

您可以从user_sequencesall_sequencesdba_sequences获取各种序列元数据。

这些 View 跨 session 工作。

编辑:

如果序列位于您的默认架构中,则:

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

如果您想要所有元数据,那么:

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

编辑2:

如果你的缓存大小不是 1,一种更可靠的冗长方法是:

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.

请注意,如果其他人在此期间使用该序列 - 他们(或您)可能会得到

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

此外,您可能希望在重置之前将缓存设置为 NOCACHE,然后再设置回其原始值,以确保您没有缓存大量值。

关于sql - 如何在不增加 Oracle 序列的情况下检索其当前值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10210273/

相关文章:

sql - 如何在 PostgreSQL 中将表设置为只读

MySQL #1241 - 操作数应包含 1 列

sql - 单个表上的集群、索引和分区

oracle - 在 oracle 11g 中收缩数据库

python - 究竟什么是序列?

mysql - 在我的数据库上创建表时出错

mysql - 在 SQL 查询中从 CURTIME() 选择分钟

oracle - c3p0 ResultSet.unwrap 抛出 AbstractMethodError

java - 在 BerkeleyDB JE 中手动创建序列

SQL:如何在一个查询中编写多个交互式脚本(插入行)