powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выдача свободного номера из диапазона
12 сообщений из 12, страница 1 из 1
Выдача свободного номера из диапазона
    #39567497
flu4u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица NUMS с диапазонами номеров, которая содержит поля:
NUM_FROM number(10,0) - номер с
NUM_TO number(10,0) - номер по
PREFIX varchar2(12) - префикс
POSTFIX varchar2(12) - постфикс
LENGTH number(2,0) - длина

Каждая запись в этой таблице - это диапазон номеров с NUM_FROM по NUM_TO, к каждому номеру добавляется префикс PREFIX и постфикс POSTFIX (если есть) и дополняется нулями слева до нужной длины LENGTH. Т.е. например запись вида:

NUM_FROM=1, NUM_TO=1000000, PREFIX=ТЕСТ/, POSTFIX=/2017, LENGTH=7

описывает номера:

ТЕСТ/0000001/2017
ТЕСТ/0000002/2017
ТЕСТ/0000003/2017
...
ТЕСТ/0999999/2017
ТЕСТ/1000000/2017

На всякий случай скажу, что диапазоны не пересекаются, т.е. нельзя создать другую запись, номера которой будут входить в уже ранее созданный диапазон, например, NUM_FROM=1, NUM_TO=2000000, PREFIX=ТЕСТ/, POSTFIX=/2017 создать нельзя.

Итого, есть таблица с диапазоном номеров и есть 5 других таблиц (T1, T2, T3, T4, T5), никак не связанных между собой, в каждой из которых есть поле NUM типа varchar2(50). Этот номер пользователь может как ввести руками, так и выбрать из любого диапазонов номеров, описанных выше. Если пользователь выбирает номер из диапазона, то ему нужно предложить первый (минимальный) свободный номер, т.е. номер из выбранного диапазона, которого нет ни в одной из 5 таблиц (T1, T2, T3, T4, T5).

Как это организовать наиболее оптимально? Попробовал написать что-то типа такого:
Код: 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.
       with n as (

                  select --+ materialize
                         level num_,
                         case when length(level) < n.length then n.prefix||lpad(level,n.length,'0')||n.postfix
                              else n.prefix||level||n.postfix
                              end num
                    from (select n.* from nums n where n.id = :ID) n
                  connect by level between n.num_from and n.num_to 
                 )
       
       select min(c2.num_)
         from (
       select n.num_
         from n
        minus
       select c1.num_
         from (
       --1
       select n.num_     
         from t1,
              n
        where t1.num = n.num
        union all
       --2
       select n.num_     
         from t2,
              n
        where t2.num = n.num
        union all
       --3
       select n.num_     
         from t3,
              n
        where t3.num = n.num
        union all
       --4
       select n.num_     
         from t4,
              n
        where t4.num = n.num
        union all
       --5
       select n.num_     
         from t5,
              n
        where t5.num = n.num
              )c1
              )c2



Т.е. из всего массива номеров диапазона вычитаем занятые и находим минимальный из полученных номеров (после для полученного числа добавим префикс и постфикс). Работает, но не быстро. Мне кажется, можно все сделать как-то оптимальнее и элегантнее.

Есть идея сделать еще одну таблицу NUMS_CONT, где при создании нового диапазона будут создаваться все номера из этого диапазона, а на таблицы T1, T2, T3, T4, T5 повесить триггера, чтобы они при создании/обновлении/удалении данных помечали записи в таблице NUMS_CONT как занятые/свободные. Тогда нахождение свободного номера сведется к запросу из одной таблицы.

Или можно сделать как-то иначе (проще/оптимальнее/эффективнее)?
...
Рейтинг: 0 / 0
Выдача свободного номера из диапазона
    #39567520
flu4u ему нужно предложить первый (минимальный) свободный номересли пользователей более одного, занятие бесполезное.
...
Рейтинг: 0 / 0
Выдача свободного номера из диапазона
    #39567523
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flu4u,

если я правильно понял задачку, то не проще ли искать минимальную "дырку" v (T1, T2, T3, T4, T5)

.....
stax
...
Рейтинг: 0 / 0
Выдача свободного номера из диапазона
    #39567526
flu4u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нормальное занятие, что не так? Есть такое требование. Если кто-то успеет занять номер, то при сохранении ругнется, что такой номер уже занят и предложит следующий первый свободный.
...
Рейтинг: 0 / 0
Выдача свободного номера из диапазона
    #39567528
flu4u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
если я правильно понял задачку, то не проще ли искать минимальную "дырку" v (T1, T2, T3, T4, T5)




В T1, T2, T3, T4, T5 могут быть любые номера из любых диапазонов, там не содержится последовательности (всего набора номеров), она описана в таблице NUMS.
...
Рейтинг: 0 / 0
Выдача свободного номера из диапазона
    #39567529
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создайте своим пяти таблицам "папу" с искомыми номерами.
...
Рейтинг: 0 / 0
Выдача свободного номера из диапазона
    #39567532
flu4u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousСоздайте своим пяти таблицам "папу" с искомыми номерами.

Номер не обязательно привязывается и выбирается из диапазона, он может быть просто номером, введенным руками. Но если он вдруг удовлетворяет диапазону, то его тоже нужно учесть при расчете первого свободного номера.
...
Рейтинг: 0 / 0
Выдача свободного номера из диапазона
    #39567538
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flu4uandrey_anonymousСоздайте своим пяти таблицам "папу" с искомыми номерами.
Номер не обязательно привязывается и выбирается из диапазона, он может быть просто номером, введенным руками. Но если он вдруг удовлетворяет диапазону, то его тоже нужно учесть при расчете первого свободного номера.
Создайте своим пяти таблицам "папу" с искомыми номерами.
И Вам придется дополнить "папу" "просто номером, введенным руками", что сведет "его тоже нужно учесть" к общему алгоритму.
А все вычисления будут выполняться на "папой", при этом грамотно использованные select for update или update returning решат вопрос многопользовательской обработки, а аккуратно подобранная схема индексирования "папы" даст приемлемую производительность.
...
Рейтинг: 0 / 0
Выдача свободного номера из диапазона
    #39567541
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
flu4u,

Создавайте по сиквенсу на каждый диапазон и их и используйте форматируя согласно правил(префиксы/постфиксы/длина)
...
Рейтинг: 0 / 0
Выдача свободного номера из диапазона
    #39567549
Храня занятые номера, быстрее ifs не прыгнешь.
В телекоме принято формировать пул свободных номеров. Тогда алгоритм наполнения может быть вдумчивым. А алгоритм резервирования требует очень краткосрочную блокировку.
Естественно, о полной бездыркости речи не идет, так как потенциальный абонент может отказаться от резерва, но рано или поздно номер подберет следующий.
...
Рейтинг: 0 / 0
Выдача свободного номера из диапазона
    #39567563
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flu4uStaxесли я правильно понял задачку, то не проще ли искать минимальную "дырку" v (T1, T2, T3, T4, T5)




В T1, T2, T3, T4, T5 могут быть любые номера из любых диапазонов, там не содержится последовательности (всего набора номеров), она описана в таблице NUMS.
чесно говоря я не понял как T1, T2, T3, T4, T5 связаны с NUMS

но
до NUMS добавить поле nextval и его палить в автономке с учетом существующих номеров в T1, T2, T3, T4, T5
получим аля пользовательская sequence

.....
stax
...
Рейтинг: 0 / 0
Выдача свободного номера из диапазона
    #39568731
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дырки в папеВ телекоме принято формировать пул свободных номеров.
В телекоме существует "отстой" для номера - заданный промежуток времени между освобождением номера и его присвоением следующему абоненту.
Как часть жизненного цикла номера.
Потому номерная емкость ведется целиком, без "дырок".
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выдача свободного номера из диапазона
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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