Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / автоматическая нумерация / 25 сообщений из 26, страница 1 из 2
21.09.2020, 14:27
    #40000908
Vlad074
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Добрый день всем.

Думаю многие сталкивались с подобной задачей. Необходима автоматическая нумерация документов. Проблема в том, что при использовании подобного кода возможны коллизии - параллельные сессии могут создать одинаковые номера.
Код: plsql
1.
2.
INSERT INTO DOCUMENTS (NOMER, ...) VALUES (SELECT MAX(NOMER)+1 FROM DOCUMENTS, ...);
COMMIT;



В таблице хранятся документы различных видов разных отделов, у каждого своя нумерация в зависимости от даты и другие условия, т.е приходящий на ум вариант использования sequences нахожу проблематичным.

Я изобрел конечно свой 'велосипед', но возможно есть какие-то базовые решения?
...
Рейтинг: 0 / 0
21.09.2020, 14:35
    #40000917
Nickname
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Привет, у меня есть табличка rms_request_seq из одного поля last_number
и тогда следующий код гарантирует уникальность и автоувеличение на 1 при любом количестве сессий

Код: plsql
1.
2.
3.
4.
5.
6.
7.
       SELECT a.last_number+1 into  num_doc
        FROM rms_request_seq a
        FOR UPDATE OF a.last_number;

        update rms_request_seq
        set last_number=num_doc;
        commit;


в переменной num_doc - новый номер для документа
...
Рейтинг: 0 / 0
21.09.2020, 14:38
    #40000921
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Vlad074,

1) вместо SELECT MAX(NOMER)+1 FROM DOCUMENTS where otdel=xxx ф-ция каторая в автономке увеличмвает счетчик
будут дырки

2) дипозитарий номеров (+повторная выдача номеров/дырки)

.....
stax
...
Рейтинг: 0 / 0
21.09.2020, 14:40
    #40000922
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
...
Рейтинг: 0 / 0
21.09.2020, 15:02
    #40000945
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Nickname,

update ... returning ...

.....
stax
...
Рейтинг: 0 / 0
21.09.2020, 15:03
    #40000947
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
123йй

автор разных отделов, у каждого своя нумерация

.....
stax
...
Рейтинг: 0 / 0
21.09.2020, 15:08
    #40000957
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Stax,
что ТС подразумевает под "своей" не оговоренно
...
Рейтинг: 0 / 0
21.09.2020, 15:10
    #40000958
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
STFF пакет для нумерации "без дырок"
...
Рейтинг: 0 / 0
21.09.2020, 15:16
    #40000962
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Stax
ф-ция каторая в автономке увеличмвает счетчик
будут дырки

Если сначала создавать документ и уже существующему присваивать номер, то вероятность дырок минимальна.
...
Рейтинг: 0 / 0
21.09.2020, 15:22
    #40000969
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
123йй
STFF пакет для нумерации "без дырок"

Избавиться от дырок адекватно только средствами СУБД не получится.
...
Рейтинг: 0 / 0
21.09.2020, 15:46
    #40000991
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Vlad074Думаю многие сталкивались с подобной задачей. Необходима автоматическая нумерация документов.

Да. И обычным результатом является вывод: "автоматическая нумерация документов не нужна".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.09.2020, 16:03
    #40001012
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Dimitry Sibiryakov
обычным результатом является вывод: "автоматическая нумерация документов не нужна".

Странный вывод.
Если непрерывная нумерация требуется для ситуаций типа бланка строгой отчетности, то нумерация нужна.
Однако задачу неизменно ставят именно в указанном убогом виде "хочу непрерывную нумерацию что бы я не делал", я это постановка не вполне адекватна.
Есть альтернативные варианты, например - можно вести перечень бракованный (аннулированных) номерных документов, которые и заполняют те самые "дырки".
Ну и, разумеется, присваивание номера имеет смысл осуществлять уже сформированному объекту по завершении проверок, процесс можно назвать "регистрация нового документа".
...
Рейтинг: 0 / 0
21.09.2020, 16:05
    #40001016
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
andrey_anonymousЕсли непрерывная нумерация требуется для ситуаций типа бланка строгой отчетности, то
нумерация нужна.

Но не автоматическая, а ручная, с записью в "журнале регистрации бланков строгой
отчётности". Возможно даже бумажном.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.09.2020, 03:39
    #40001151
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Vlad074
В таблице хранятся документы различных видов разных отделов, у каждого своя нумерация в зависимости от даты и другие условия

В этом случае нужно отличать номер документа, присваиваемый человеком, и автоматически генерируемый ID, который используется только как ключ в БД и человеку никогда не показывается.
Это 2 разных поля .
...
Рейтинг: 0 / 0
22.09.2020, 03:44
    #40001152
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Если у каждого отдела своя нумерация, то разве sequence на каждый отдел не решит проблему?

Это конечно предполагает что отдел:номер являются уникальным индексом, что может создать проблему коллизий при слиянии отделов.
...
Рейтинг: 0 / 0
22.09.2020, 04:11
    #40001153
serpv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
sequence на каждый отдел не решит, т.к. не обеспечит "хочу непрерывную нумерацию что бы я не делал"
...
Рейтинг: 0 / 0
22.09.2020, 05:44
    #40001158
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
НеофитSQL
разве sequence на каждый отдел не решит проблему?

Мусорка получится, потому как отделов может быть масса, они могут появляться, расформировываться и т.п.

Даёшь каждому работнику по сиквенсу! И ещё запасной вдобавок, чтоб наверняка. Гы.
...
Рейтинг: 0 / 0
22.09.2020, 06:14
    #40001160
Synoptic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Код: plsql
1.
2.
3.
4.
5.
6.
7.
create or replace trigger table_ins
  before insert
  on tmp_table 
  for each row
begin
  select max(id_doc)+1 into :new.id_doc from tmp_table ;
end table_ins;
...
Рейтинг: 0 / 0
22.09.2020, 08:31
    #40001168
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Synoptic,

а в ето время в соседней сессии ...

.....
stax
...
Рейтинг: 0 / 0
22.09.2020, 09:12
    #40001173
SimonInBlues
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
1). Создать таблицу, в которой нужно хранить код отдела, год и последний выданный номер.
2). Написать автономную функцию, которая по переданному в нее коду отдела и году обновляет последний выданный номер в таблице и возвращает его.
3). Вместо обращения к сиквенсу использовать обращение к этой функции.
4). Если надо номер "без дырок", то в пункте 1 придется хранить не только последний, но все номера. При этом надо будет сделать перекрестные ссылки строки документа на строку в этой таблице (и наоборот) по составному ключу "код+год+номер".
...
Рейтинг: 0 / 0
22.09.2020, 10:10
    #40001197
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Ни "Max(X)+1", ни хранение в таблице не обеспечит уникальность, поскольку в рамках одной транзакции вы не увидите новые значения, записанные другой транзакцией (например, вашего коллеги). Поэтому для решения задачи единственным вариантом является использование надтранзакционных механизмов, а именно Sequences. Во избежание ошибок, уникальное значение из Sequence необходимо присваивать только тогда, когда документ уже сформирован, например, перед печатью документа или перед его электронным подписыванием.
Для решения проблемы "Уникальный номер отдела", придётся в БД создавать для каждого отдела свой Sequence и, например в триггере по коду отдела определять требуемый Sequence.
...
Рейтинг: 0 / 0
22.09.2020, 10:21
    #40001202
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Кстати, для скважности и отдела, и в целом предприятия, в свое время использовал такие номера например : "123.4", где 123 - последовательность предприятия, 4 - последовательность отдела.
...
Рейтинг: 0 / 0
22.09.2020, 10:22
    #40001203
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
zeon11
Поэтому для решения задачи единственным вариантом является использование надтранзакционных механизмов, а именно Sequences.

а если подумать ?
...
Рейтинг: 0 / 0
22.09.2020, 11:52
    #40001228
Vlad074
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
Спасибо всем за ответы.

В итоге я пришел к такому же варианту, как в первом ответе - через SELECT FOR UPDATE.
Перед этим хранил последние номера в таблице сохраняя через автономную функцию (как в ответе #2). Но с ростом данных в ней - у каждого отдела куча типов документов и каждый месяц начинается новый отсчет - пришел к первому варианту.

Смущало только что есть таблица, данные в которой не нужны, а используется только для блокировки в SELECT FOR UPDATE - думал какие еще есть варианты.
...
Рейтинг: 0 / 0
22.09.2020, 12:22
    #40001244
Агрох
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автоматическая нумерация
В порядке бреда. Нужно ли хранить номер документа в таблице? Документы из базы удаляются или помечаются как удалённые?

К чему я это. Создать таблицу с обычным сквозным ID на всю таблицу. Создать представление, где добавить поле вида:
Код: sql
1.
ROWNUM OVER(PARTITION BY Month, Department ORDER BY ID ASC) AS DocNumber



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


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