Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Игры с sequence / 5 сообщений из 5, страница 1 из 1
07.04.2003, 15:21
    #32134813
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игры с sequence
Вроде бы всё нормально, только как отражается значение столбца 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
07.04.2003, 17:22
    #32134981
Um
Um
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игры с sequence
Декларируется что last_number показывает ближайшее свободное значения для последовательности.
А вот вопросик в связи с поднятой темой - можно ли сбросить последовательность на начальное значение?
...
Рейтинг: 0 / 0
07.04.2003, 18:01
    #32135027
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игры с sequence
Только через пересоздание
...
Рейтинг: 0 / 0
07.04.2003, 19:38
    #32135119
SAA_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игры с sequence
Или указать, что sequence циклический...
...
Рейтинг: 0 / 0
08.04.2003, 15:50
    #32135910
MaxU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Игры с sequence
теоретически сбросить счетчик на начальное значение, если оно известно,элементарно - указываешь инкремент равный (-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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Игры с sequence / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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