powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли в merge сослаться на sequence.nextval?
2 сообщений из 2, страница 1 из 1
Можно ли в merge сослаться на sequence.nextval?
    #40142617
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть историческая таблица атрибутов с такой структурой: ID, PARENT_ID, ROOT_ID, HEIR_ID, DATE_BEG, DATE_END.
ID — идентификатор записи
PARENT_ID — ссылка на сущность (родительский объект, для которого сохраняются атрибуты)
ROOT_ID — ссылка на первый элемент в истории
HEIR_ID — ссылка на следующий элемент в истории
DATE_BEG — дата начала действия записи
DATE_END — дата окончания действия записи (или null, если даты окончания нет)

Пример данных:
ID PARENT_ID ROOT_ID HEIR_ID DATE_BEG DATE_END
1 1 null 2 2020-01-01 2020-02-01
2 1 1 3 2020-02-01 2020-03-01
3 1 1 null 2020-03-01 null
Мне нужно вставить в эту таблицу новую точку редакции. Желательно одним запросом.
Делаю примерно так:
Код: SQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
merge into D
using (
select D.X
, nvl2(D.X,ID,null) as ID
, PARENT_ID
, nvl2(D.X,ROOT_ID,nvl(ROOT_ID,TARIFFEL_ID)) as ROOT_ID
, null as HEIR_ID
, nvl2(D.X,DATE_BEG,sysdate) as DATE_BEG
, nvl(D.X,sysdate,null) as DATE_END
from ...
join (select 0 as X from DUAL union all select 1 from DUAL) D on (X is not null)
) S on (S.ID = D.ID)
when matched then update set D.DATE_END = sysdate
when not matched then
  insert (D.PARENT_ID, D.ROOT_ID, D.DATE_BEG, D.DATE_END)
  values (S.PARENT_ID, S.ROOT_ID, sysdate, null)
Вопрос только в том, можно ли сразу заполнить HEIR_ID (в предложении when matched then update)?
...
Рейтинг: 0 / 0
Можно ли в merge сослаться на sequence.nextval?
    #40142619
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Указывать seq.NEXTVAL непосредственно в запросе я не могу.
Во-первых, NEXTVAL одновременно и увеличивает последовательность, то есть в новую строку будет вставлено другое значение.
Во-вторых, NEXTVAL нельзя использовать в запросах update.
Мне нужно узнать, какое значение будет вставлено в следующую новую строку, и подставить его в update-запрос, не обновляя sequence.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли в merge сослаться на sequence.nextval?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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