powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Копирование счетчика последовательности (2 экземпляра)
5 сообщений из 5, страница 1 из 1
Копирование счетчика последовательности (2 экземпляра)
    #39500159
aquarium89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую.

Есть 2 экземпляра, условно W_1 и T_1.
В W_1 имеется таблица w.tab1 и последовательностью w.seq1 (со значением 1000).

Импортирую эту таблицу с последовательностью в T_1.

Получается:
t.tab1
t.seq1 (значение счетчика на время импорта 1000).

Но.
Во время импорта таблицы w.tab1 счетчик увеличивается (например) на 10 пунктов и становится соответственно 1010.
В итоге, таблица t.tab1 имеет значение по новому счетчику 1010, а последовательность t.seq1 имеет значение 1000 (БД то работала в это время).

ИТОГ: ora-00001

ВОПРОС.
Как после процедуры импорта перечитать значение счетчика последовательности w.seq1 в t.seq1+n (+n в данном случае значит что надо будет прибавить к значению из w.seq1 n-пунктов).

Т.е. в итоге получится так:
1. экспорт w.seq1 (1000)
2. экспорт w.tab1 (1010)
3. импорт t.seq1 (1000)
4. импорт t.tab1 (1010)
5. читаем w.seq1 (1010)
6. меняем t.seq1 (1000) на t.seq1 (1010+n)
7. получаем t.tab1 (1010) / t.seq1 (1011)

Реально?
...
Рейтинг: 0 / 0
Копирование счетчика последовательности (2 экземпляра)
    #39500197
Фотография Viewer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
6. задаём владельца, имя последовательности и желаемое значение (которое может быть как больше, так и меньше текущего).
Код: plsql
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.
CREATE OR REPLACE procedure Refresh_Seq (p_owner varchar2, p_name varchar2, p_need_val number)
as
  -- процедура изменяет последовательность таким образом, чтобы при следующем вызове
  -- последовательность возвратит p_need_val
  -- процедура применима только к возрастающим последовательностям (у которых задано MINVALUE)
  -- ВНИМАНИЕ: если p_need_val меньше текущего значения, то MINVALUE изменится
  sql_str        varchar2(500);
  l_cache        varchar2(30);
  l_increment    number;
  l_last_num     number;
  l_curr_val     number;
begin
  -- получить значения cache_size, increment_by, last_number
  select case cache_size when 0 then ' nocache ' else ' cache ' || to_char(cache_size) end,
         increment_by,
         last_number
  into l_cache, l_increment, l_last_num
  from dba_sequences
  where sequence_owner = p_owner and sequence_name = p_name;
  if p_need_val = l_last_num then
    -- последовательность или ни разу не вызывалась,
    -- или смысла что-то трогать нет
    null;
  else
    if p_need_val > l_last_num then
      -- отключить кеширование, minvalue не трогать
      sql_str := 'alter sequence ' || p_owner || '.' || p_name
              || ' nocache';
    else
      -- отключить кеширование, сдвинуть minvalue
      sql_str := 'alter sequence ' || p_owner || '.' || p_name
              || ' nocache'
              || ' minvalue ' || to_char(p_need_val - l_increment);
    end if;
    execute immediate sql_str;
    -- получить текущее значение последовательности
    sql_str := 'select ' || p_owner || '.' || p_name || '.nextval from dual';
    execute immediate sql_str into l_curr_val;
    -- если после этого следующий вызов последовательности выдаст нужный результат,
    -- то все, иначе 
    if (p_need_val - l_increment - l_curr_val) <> 0 then
      -- increment_by на нужное значение
      sql_str := 'alter sequence ' || p_owner || '.' || p_name
              || ' increment by ' || to_char(p_need_val - l_increment - l_curr_val);
      execute immediate sql_str;
      -- установить последовательность в нужное значение
      sql_str := 'select ' || p_owner || '.' || p_name || '.nextval from dual';
      -- после чего l_curr_val будет равен p_need_val - l_increment, т.е. MINVALUE
      execute immediate sql_str into l_curr_val;
    end if;
    -- возвращаем cache_size и increment_by
    sql_str := 'alter sequence ' || p_owner || '.' || p_name
            || ' increment by ' || to_char(l_increment)
            --|| ' minvalue ' || to_char(l_curr_val)
            || l_cache;
    execute immediate sql_str;
  end if;
  -- следующий вызов последовательности даст p_need_val
end;
/

...
Рейтинг: 0 / 0
Копирование счетчика последовательности (2 экземпляра)
    #39500204
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. если есть линки, использовать один и тот же счетчик
2. на одной БД счетчик от 1 до 100000, на другой от 100001 до 200000
...
Рейтинг: 0 / 0
Копирование счетчика последовательности (2 экземпляра)
    #39500214
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx1. если есть линки, использовать один и тот же счетчик
2. на одной БД счетчик от 1 до 100000, на другой от 100001 до 200000
імхо
бывает что 100000 неожиданно быстро палятся
луче четные/нечетные

.....
stax
...
Рейтинг: 0 / 0
Копирование счетчика последовательности (2 экземпляра)
    #39500226
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще лучше строкой
db1_1, db1_2, ..., db1_123456789
db2_1, db2_2, ..., db2_123456789

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


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