powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / автоматическая нумерация
25 сообщений из 26, страница 1 из 2
автоматическая нумерация
    #40000908
Vlad074
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем.

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



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

Я изобрел конечно свой 'велосипед', но возможно есть какие-то базовые решения?
...
Рейтинг: 0 / 0
автоматическая нумерация
    #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
автоматическая нумерация
    #40000921
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad074,

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

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

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

update ... returning ...

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

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

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

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

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

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

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

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

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

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

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

Даёшь каждому работнику по сиквенсу! И ещё запасной вдобавок, чтоб наверняка. Гы.
...
Рейтинг: 0 / 0
автоматическая нумерация
    #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
автоматическая нумерация
    #40001168
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Synoptic,

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

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

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

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

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

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



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


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