2011-01-04 6 views
3

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

Я могу запросить user_sequences, чтобы получить last_number для каждой последовательности, а I может получить max(id_number) для каждой таблицы. Но когда я пытаюсь сделать оба в одном запросе, я возвращаю null.

Мой сломаны 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

Ненавижу, когда клиенты делают что-то. И им не хватает причины, почему они это делают! –

+1

Возможно, вы могли бы что-то сделать с клиентом несколько раз, пока они не перестанут делать что-то. –

ответ

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 
+0

Спасибо, Винсент, это было именно то, что мне нужно. –

+0

Не может быть более одной последовательности с тем же именем и владельцем - нет необходимости в MAX для last_number. –

+0

Значит, они вернут тот же ответ? :) исправлено –

0

пытаются использовать seq.nextval :)

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

Это не хорошо pratice использовать Max (в случае последняя строка удалена!).

+1

-1: NEXTVAL будет продвигать последовательность - вы хотите использовать CURRVAL, но это не означает, что кто-то не выполнил что-то, чтобы продвигать последовательность примерно в одно и то же время. –

1

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

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

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

3

Я хотел бы предложить не доверяйте «LAST_NUMBER» из user_sequences, потому что если кэш включен время создавая последовательность, то 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 
+1

Если пробелы в последовательности вызывают проблемы, то в дизайне приложения уже что-то не так. –

Смежные вопросы