Как проверить последовательности Oracle - PullRequest
3 голосов
/ 04 января 2011

У нас есть клиент, который делает {что-то}, и после этого некоторые из наших последовательностей возвращают числа, которые уже были использованы.Хотя долгосрочным ответом было бы, чтобы они перестали делать {что-то}, мне нужен простой способ проверить последовательности по таблицам, в которых они используются.

Я могу запросить 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 ]

4 голосов
/ 18 октября 2012

Я бы предложил никогда не доверять «last_number» user_sequence, потому что если при создании последовательности включен кэш, то 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
4 голосов
/ 04 января 2011

вы можете получить МАКС из обеих таблиц с помощью этого запроса:

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 голос
/ 04 января 2011

seq.nextval будет работать, но также будет увеличивать последовательность.Если вы уже вызывали nextval в текущем сеансе, вы можете вызвать seq.currval.

Если вы вызовете currval перед вызовом nextval, он выдаст исключение.

Я бы сделал:
select last_number from user_sequences where sequence_name = 'seq'

0 голосов
/ 04 января 2011

попробуйте использовать seq.nextval:)

Смотрите здесь: http://www.techonthenet.com/oracle/sequences.php

Не рекомендуется использовать Макс (в случае удаления последней строки!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...