powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Игры с sequence
5 сообщений из 5, страница 1 из 1
Игры с sequence
    #32134813
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде бы всё нормально, только как отражается значение столбца last_number в user_sequences вызывает непонимание:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
 -- создадим
 
drop  sequence test;
create sequence test minvalue  1  maxvalue  10  start with  1  increment by  1  nocache;
 -- значение через currval
 
select test.currval from dual;
 -- значение через user_sequences
 
select sequence_name, min_value, max_value, last_number from user_sequences;
 -- Получим первых 10 значенией
 
select
  test.nextval
from 
  all_users
where
 rownum< 11 ;

 -- значение через currval
 
select test.currval from dual;
 -- значение через user_sequences
 
select sequence_name, min_value, max_value, last_number from user_sequences;
 -- теперь обратно
 
alter sequence test increment by - 1 ;
select
  test.nextval
from 
  all_users
where
 rownum< 11 ;

 -- значение через currval
 
select test.currval from dual;
 -- значение через user_sequences
 
select sequence_name, min_value, max_value, last_number from user_sequences;
 -- повторим еще раз вперёд
 
alter sequence test increment by  1 ;
select sequence_name, min_value, max_value, last_number from user_sequences;
select test.currval from dual;
select sequence_name, min_value, max_value, last_number from user_sequences;
select
  test.nextval
from 
  all_users
where
 rownum< 11 ;
select test.currval from dual;
select sequence_name, min_value, max_value, last_number from user_sequences;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
SQLWKS>  -- создадим
 
SQLWKS> drop  sequence test;
Предложение обработано.
SQLWKS> create sequence test minvalue  1  maxvalue  10  start with  1  increment by  1  nocache;
Предложение обработано.
SQLWKS>  -- значение через currval
 
SQLWKS> select test.currval from dual;
ORA- 08002 : последов. TEST.CURRVAL еще не определен в этом сеансе
SQLWKS>  -- значение через user_sequences
 
SQLWKS> select sequence_name, min_value, max_value, last_number from user_sequences;
SEQUENCE_NAME                  MIN_VALUE  MAX_VALUE  LAST_NUMBE
 ------------------------------ ---------- ---------- ----------
 
TEST                                     1           10            1 
Выбрана  1  строка.
SQLWKS>  -- Получим первых 10 значенией
 
SQLWKS> select
      2 >   test.nextval
      3 > from 
      4 >   all_users
      5 > where
      6 >  rownum< 11 ;
NEXTVAL   
 ----------
 
          1 
          2 
          3 
          4 
          5 
          6 
          7 
          8 
          9 
         10 
Выбрано  10  строк.
SQLWKS> 
SQLWKS>  -- значение через currval
 
SQLWKS> select test.currval from dual;
CURRVAL   
 ----------
 
         10 
Выбрана  1  строка.
SQLWKS>  -- значение через user_sequences
 
SQLWKS> select sequence_name, min_value, max_value, last_number from user_sequences;
SEQUENCE_NAME                  MIN_VALUE  MAX_VALUE  LAST_NUMBE
 ------------------------------ ---------- ---------- ----------
 
TEST                                     1           10           11 
Выбрана  1  строка.
SQLWKS>  -- теперь обратно
 
SQLWKS> alter sequence test increment by - 1 ;
Предложение обработано.
SQLWKS> select
      2 >   test.nextval
      3 > from 
      4 >   all_users
      5 > where
      6 >  rownum< 11 ;
NEXTVAL   
 ----------
 
ORA- 08004 : последов. TEST.NEXTVAL goes below MINVALUE и не может быть установлено
SQLWKS> 
SQLWKS>  -- значение через currval
 
SQLWKS> select test.currval from dual;
CURRVAL   
 ----------
 
          1 
Выбрана  1  строка.
SQLWKS>  -- значение через user_sequences
 
SQLWKS> select sequence_name, min_value, max_value, last_number from user_sequences;
SEQUENCE_NAME                  MIN_VALUE  MAX_VALUE  LAST_NUMBE
 ------------------------------ ---------- ---------- ----------
 
TEST                                     1           10            0 
Выбрана  1  строка.
SQLWKS>  -- повторим еще раз вперёд
 
SQLWKS> alter sequence test increment by  1 ;
Предложение обработано.
SQLWKS> select sequence_name, min_value, max_value, last_number from user_sequences;
SEQUENCE_NAME                  MIN_VALUE  MAX_VALUE  LAST_NUMBE
 ------------------------------ ---------- ---------- ----------
 
TEST                                     1           10            2 
Выбрана  1  строка.
SQLWKS> select test.currval from dual;
CURRVAL   
 ----------
 
          1 
Выбрана  1  строка.
SQLWKS> select sequence_name, min_value, max_value, last_number from user_sequences;
SEQUENCE_NAME                  MIN_VALUE  MAX_VALUE  LAST_NUMBE
 ------------------------------ ---------- ---------- ----------
 
TEST                                     1           10            2 
Выбрана  1  строка.
SQLWKS> select
      2 >   test.nextval
      3 > from 
      4 >   all_users
      5 > where
      6 >  rownum< 11 ;
NEXTVAL   
 ----------
 
ORA- 08004 : последов. TEST.NEXTVAL exceeds MAXVALUE и не может быть установлено
SQLWKS> select test.currval from dual;
CURRVAL   
 ----------
 
         10 
Выбрана  1  строка.
SQLWKS> select sequence_name, min_value, max_value, last_number from user_sequences;
SEQUENCE_NAME                  MIN_VALUE  MAX_VALUE  LAST_NUMBE
 ------------------------------ ---------- ---------- ----------
 
TEST                                     1           10           11 
Выбрана  1  строка.
...
Рейтинг: 0 / 0
Игры с sequence
    #32134981
Um
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Декларируется что last_number показывает ближайшее свободное значения для последовательности.
А вот вопросик в связи с поднятой темой - можно ли сбросить последовательность на начальное значение?
...
Рейтинг: 0 / 0
Игры с sequence
    #32135027
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только через пересоздание
...
Рейтинг: 0 / 0
Игры с sequence
    #32135119
SAA_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или указать, что sequence циклический...
...
Рейтинг: 0 / 0
Игры с sequence
    #32135910
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теоретически сбросить счетчик на начальное значение, если оно известно,элементарно - указываешь инкремент равный (-seq_name.currval), потом запускаешь

Код: plaintext
1.
2.
select seq_name.nextval from dual;
alter sequence seq_name increment by <old_increment>



НО практически это бывает трудно сделать в многопользовательской среде, т.е. если еще пару сессий запросят "nextval" после того как ты поменял "increment" и до того как ты вернул его на место, то предсказать что ты получишь будет трудно.
поэтому если ты можешь гарантировать, что НИКТО больше не может запросить "nextval" в течение вышеописанной прощедуры, то это делается элементарно...

удачи!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Игры с sequence
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]