如何验证Oracle序列

时间:2011-01-04 16:57:32

标签: sql oracle

我们有一个客户做{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' ;

4 个答案:

答案 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并不是一个很好的实践(如果最后一行被删除了!)。