我们有一个客户做{something},然后我们的一些序列返回已经使用过的数字。虽然长期的答案是让他们停止做{something},但我需要一种简单的方法来检查它们所用表格的顺序。
我可以查询user_sequences
获取每个序列的last_number
,我可以获得每个表的max(id_number)
。但是当我尝试在同一个查询中执行这两个操作时,我得到了空值。
我破碎的SQL是:
select max(last_number) , max(id_number) from user_sequences,
squiggly.ACCOUNT_CODE_DEFINITION where sequence_name = 'ACCOUNT_CODE_DEFINITION_SEQ'
and sequence_owner = 'SQUIGGLY' ;
答案 0 :(得分:4)
您可以使用此查询从两个表中获取MAX:
SELECT (SELECT last_number
FROM all_sequences
WHERE sequence_name = 'ACCOUNT_CODE_DEFINITION_SEQ'
AND sequence_owner = 'SQUIGGLY') max_sequence,
(SELECT MAX(id_number)
FROM squiggly.ACCOUNT_CODE_DEFINITION) max_id_number
FROM dual
答案 1 :(得分:4)
我建议永远不要相信" last_number" user_sequences,因为如果在创建序列时启用了Cache,则last_number可能包含一个大于序列当前值的值。
好吧,我使用了以下步骤
1) select <seq_name>.nextval from dual;
2) select <seq_name>.currval from dual;
由于你不能单独执行currval,所以我先执行nextval。
SQL> create sequence seq;
Sequence created.
SQL> select last_number from user_sequences;
LAST_NUMBER
-----------
1
SQL> select seq.nextval from dual;
NEXTVAL
----------
1
SQL> select seq.currval from dual;
CURRVAL
----------
1
SQL> select last_number from user_sequences;
LAST_NUMBER
-----------
21
SQL> select seq.currval from dual;
CURRVAL
----------
1
答案 2 :(得分:1)
seq.nextval将起作用,但也会增加序列。如果您已在当前会话中调用nextval,则可以调用seq.currval。
如果在调用nextval之前调用currval,则会抛出异常。
我愿意:
select last_number from user_sequences where sequence_name = 'seq'
答案 3 :(得分:0)
尝试使用seq.nextval:)
请看这里:http://www.techonthenet.com/oracle/sequences.php
使用Max并不是一个很好的实践(如果最后一行被删除了!)。