是否有一条SQL指令来检索不递增序列值的值。
谢谢。
编辑与结论
正如贾斯汀·凯夫(Justin Cave)所说,尝试“保存”序列号没有用,因此
select a_seq.nextval from dual;
足以检查序列值。
我仍然保持Ollie的回答为好答案,因为它回答了最初的问题。但请问一下自己是否有必要修改序列的必要性。
nextval
要测试的序列的不利之处是什么?您不是在假设序列是无间隙的,对吗?因此,“浪费”序列值不应该成为问题。
是否有一条SQL指令来检索不递增序列值的值。
谢谢。
编辑与结论
正如贾斯汀·凯夫(Justin Cave)所说,尝试“保存”序列号没有用,因此
select a_seq.nextval from dual;
足以检查序列值。
我仍然保持Ollie的回答为好答案,因为它回答了最初的问题。但请问一下自己是否有必要修改序列的必要性。
nextval
要测试的序列的不利之处是什么?您不是在假设序列是无间隙的,对吗?因此,“浪费”序列值不应该成为问题。
Answers:
SELECT last_number
FROM all_sequences
WHERE sequence_owner = '<sequence owner>'
AND sequence_name = '<sequence_name>';
你可以得到各种从序列的元数据user_sequences
,all_sequences
和dba_sequences
。
这些视图跨会话工作。
编辑:
如果该序列在您的默认架构中,则:
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
重置之前的值,然后再重置为原始值,以确保没有缓存很多值。
ALL_SEQUENCES
是一个视图。如果您无权访问,请尝试从USER_SEQUENCES
默认模式中选择序列。(您不需要的sequence_owner = '<sequence_owner>'
子句USER_SEQUENCES
)。
LAST_NUMBER
中ALL_SEQUENCES
不会是最后一个号码,一个会话实际提供并不会会从调用返回的数量sequence_name.nextval
一般。假设您已将序列设置为CACHE
大于1(默认值为20),LAST_NUMBER
它将是缓存中的最后一个数字。无法保证将这个数字实际分配给任何会话。
ALTER SEQUENCE seq INCREMENT BY -1;
除非可以保证没有其他会话会调用,否则这将是一个问题seq.nextval
。否则,序列将分发重复的值,这通常不是人们想要的。
在我的情况下,我还尝试使用CURRVAL来确定某个进程是否以该序列作为主键将新行插入到了某个表中。我的假设是CURRVAL是最快的方法。但是a)CurrVal不起作用,因为您在另一个Oracle会话中,它只会获得旧值,直到您在自己的会话中执行NEXTVAL为止。b)a select max(PK) from TheTable
也非常快,可能是因为PK总是被索引。或者select count(*) from TheTable
。我仍在尝试,但两个SELECT似乎都很快。
我不介意序列中存在差距,但就我而言,我正在考虑进行大量轮询,并且我讨厌存在很大差距的想法。尤其是如果简单的SELECT速度一样快。
结论: