Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
-2-
Member

Откуда:
Сообщений: 15330
Сергей Арсеньев
лочим соседей
select ...
 for update;
Тут приходит фантом-ас и соседей дрючит в ass.
8 фев 11, 14:21    [10202205]     Ответить | Цитировать Сообщить модератору
 Re: как взять яйца в кошёлке соседней сессии и подменить на свои  [new]
Как??!
Guest
Сергей Арсеньев,

с пункта 3 подробный кейс в sql*plus
8 фев 11, 14:36    [10202317]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Как??!,

на халяву?
8 фев 11, 14:42    [10202363]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Сергей Арсеньев,

+ Хотя что уж там
select rowID,rightNeighbor into leftRowID,leftToRightNeighbor from innerTable
 where rowID in (
  select RID from (
   select rowID RID from innerTable
    where endDate<:newBeginDate
    order by endDate desc)
   where rownum=1
 )

 if (leftToRightNeighbor is null) then
  insert into innerTable (beginDate,endDate,leftNeighbor) 
   values  (newBeginDate,newEndDate,leftRowID);
  update ...
 else
  select rowID,rightNeighbor into rightRowID,rightToLeftNeighbor from innerTable
   where rowID in (
    select RID from (
      select rowID RID from innerTable
        where beginDate>:newEndDate
        order by beginDate asc)
    where rownum=1
 )
-- если тут нотфоунд, то значит пересечение
  if (rightToLeftNeighbor=leftToRightNeighbor) then
--  ну вроде чисто
   insert ...
   update ...
   update ...
  else
-- ну тут тоже наезд
  end if;
 end if;
8 фев 11, 15:07    [10202567]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
stax..
Guest
ioannov
Исходные данные:
началоконец
1.1.201131.1.2011
1.2.201128.2.2011
1.3.201131.3.2011

Необходимо, что бы при попытке задать значение, уже входящее в диапазон, ошибку. Например: 2.2.2011 / 04.02.2011 - должно вызвать ошибку.
А не входящие в период должны успешно добавляться в таблицу, например: 1.4.2011 / 4.4.2011.

Или не правильно формулирую вопрос, или google молчит по этому поводу. Подскажите?

как Вы решаете вопрос если вставляются незакомиченные пересекающиеся данные паралельно?
напр
в первой сессии 01.01.2012 20.01.2012
во второй 15.01.2012 25.01.2012

коммитов ни в первой, ни во второй пока нет
8 фев 11, 15:09    [10202584]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
stax..,

человек это делает один раз в месяц, транзакции у него столько не живут :)
8 фев 11, 15:11    [10202590]     Ответить | Цитировать Сообщить модератору
 Re: Серёжа не в теме  [new]
Так это не то
Guest
Сергей Арсеньев,

Конкуренция в примере где? Где правка записей соседних конкурентных сессий, вставляющих/меняющих на пересекающиеся диапазоны?
8 фев 11, 15:12    [10202601]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
stax..
Guest
Сергей Арсеньев
stax..,

человек это делает один раз в месяц, транзакции у него столько не живут :)

имхо
так вообще не стоит заморачиватся
ответственный
1)вставил один раз в месяц
2)проверил есть ли пересекающиеся
3)если нет коммит, выход
4)если есть разобрались и на 1


.....
stax
8 фев 11, 15:18    [10202642]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Так это не то,

Для того чтобы вставить надо залочить соседей между которыми будете вставлять, если залочили вы папа и никто другой не сможет встать между ними - а значит пересечься с вами. Или я где-то что-то пропустил?
8 фев 11, 15:19    [10202651]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Так это не то,

Для того чтобы вставить надо залочить соседей между которыми будете вставлять, если залочили вы папа и никто другой не сможет встать между ними - а значит пересечься с вами. Или я где-то что-то пропустил?
8 фев 11, 15:21    [10202669]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
AlexVer
Member

Откуда: Москва
Сообщений: 80
Можно попробовать использовать Workspace Manager Valid Time Support:
см. Example 3-14 Insert Operation Failing Because of Overlapping Time Periods
8 фев 11, 15:25    [10202691]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Жаль, что нельзя добавить такой вычислимый столбец + check на него = 1.
SQL> CREATE OR REPLACE TYPE typtyp AS OBJECT (x1 date, x2 date, ORDER MEMBER FUNCTION f(p typtyp) RETURN INTEGER
  2  )
  3  /
 
Type created
SQL> CREATE OR REPLACE TYPE BODY typtyp AS
  2      ORDER MEMBER FUNCTION f(p typtyp) RETURN INTEGER IS
  3      BEGIN
  4          RETURN CASE WHEN p.x1 <= x2 and p.x2 >= x1 THEN 0 ELSE 1 END;
  5      END;
  6  END;
  7  /
 
Type body created
SQL> with test_check as
  2  (select to_date('1.1.2011') x1, to_date('31.1.2011') x2 from dual
  3  union all select to_date('1.2.2011') x1, to_date('28.2.2011') x2 from dual
  4  union all select to_date('1.3.2011') x1, to_date('31.3.2011') x2 from dual
  5  union all select to_date('2.2.2011') x1, to_date('4.2.2011') x2 from dual
  6  union all select to_date('1.4.2011') x1, to_date('4.4.2011') x2 from dual)
  7  select x1, x2, count(*) over (partition by typtyp(x1,x2)) cnt
  8  from test_check
  9  /
 
X1          X2                 CNT
----------- ----------- ----------
01.04.2011  04.04.2011           1
01.03.2011  31.03.2011           1
01.02.2011  28.02.2011           2
02.02.2011  04.02.2011           2
01.01.2011  31.01.2011           1
Тогда бы все решалось достаточно элегантно.
8 фев 11, 16:34    [10203171]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
dbms_photoshop,

можно, уникальный domain индекс, только оно надо?

Если редко - lock table и далее везде.

Если откатывать много операций не надо - атомарные автономные транзакции (по одному диапазону и комит).

Если часто, по долгу, в разные места с возможностью откатить много операций - двусторонний список (вероятен конфликт по взаимным блокировкам).
8 фев 11, 16:43    [10203233]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Сергей Арсеньев
можно, уникальный domain индекс, только оно надо?
Про domain индекс я уже упомянул в предыдущем своем сообщении. Какое он имеет отношение к типу, упомянутому в последнем моем сообщении?
Сергей Арсеньев
Если редко - lock table и далее везде.
Извращение имхо.
Сергей Арсеньев
Если откатывать много операций не надо - атомарные автономные транзакции (по одному диапазону и комит).
А это вообще здесь при чем?
Сергей Арсеньев
Если часто, по долгу, в разные места с возможностью откатить много операций - двусторонний список (вероятен конфликт по взаимным блокировкам).
А это о чем?
В твоем примере "Хотя что уж там" по моему тоже две параллельные сессии прекрасно вставят пересекающие интервалы (ты итоговый тест кейс так и не смог предоставить).
Создается впечатление, что ты пытаешься навязать свои подходы по удалению гланд через ж*пу, или я что-то пропустил. :))
8 фев 11, 17:16    [10203414]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
100500
Member

Откуда:
Сообщений: 124
ioannov
Исходные данные:
началоконец
1.1.201131.1.2011
1.2.201128.2.2011
1.3.201131.3.2011

Необходимо, что бы при попытке задать значение, уже входящее в диапазон, ошибку. Например: 2.2.2011 / 04.02.2011 - должно вызвать ошибку.
А не входящие в период должны успешно добавляться в таблицу, например: 1.4.2011 / 4.4.2011.

Или не правильно формулирую вопрос, или google молчит по этому поводу. Подскажите?


Решал я такую проблему для частного случая - даты были только целыми (без времени), интервалы небольшими, ну и число записей в таблице в разумных пределах.

Завел дочернюю таблицу (IOT) с parent_id,date (они же PK), строчными триггерами на родителя зеркалировал интервал родителя в набор записей дочерней таблицы, все остальное делал уже сам Оракл. Минусы очевидны, но тут уже дело вкуса.
8 фев 11, 17:36    [10203596]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
Banditos
Member

Откуда:
Сообщений: 88
ioannov
Исходные данные:
началоконец
1.1.201131.1.2011
1.2.201128.2.2011
1.3.201131.3.2011

Необходимо, что бы при попытке задать значение, уже входящее в диапазон, ошибку. Например: 2.2.2011 / 04.02.2011 - должно вызвать ошибку.
А не входящие в период должны успешно добавляться в таблицу, например: 1.4.2011 / 4.4.2011.

Или не правильно формулирую вопрос, или google молчит по этому поводу. Подскажите?


Может ли у этой задачи быть простое решение типа проверки:

Дата1 <= конец AND Дата2 >= начало

где "Дата1" и "Дата2" - даты вводимого нами нового периода.
Естественно, "Дата1" <= "Дата2".

ИМХО, заморачиваться на конкуренции в данной задаче нет никакого смыла. Ибо пересекающихся событий на год не более 365(366), т.е. максимум с частотой 1 раз в день ежедневно в течении года - из чего следует, что о неком массовом вводе подобной информации речь идти просто не может...
8 фев 11, 18:24    [10203905]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
Elic
Member

Откуда:
Сообщений: 29978
Banditos
ИМХО, заморачиваться на конкуренции в данной задаче нет никакого смыла. Ибо пересекающихся событий на год не более 365(366), т.е. максимум с частотой 1 раз в день ежедневно в течении года - из чего следует, что о неком массовом вводе подобной информации речь идти просто не может...
Те, кто не читал законов Мерфи, тоже так думали ...
8 фев 11, 18:32    [10203953]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
Banditos
Member

Откуда:
Сообщений: 88
Elic
Те, кто не читал законов Мерфи, тоже так думали ...

Имхо, не нужно заморачиваться сложностью решения, когда все объясняется некорректностью постановки задачи.
8 фев 11, 18:37    [10203984]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
Elic
Member

Откуда:
Сообщений: 29978
Banditos
когда все объясняется некорректностью постановки задачи.
И в чём некорректность?
8 фев 11, 18:39    [10203998]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
-2-
Member

Откуда:
Сообщений: 15330
Banditos
т.е. максимум с частотой 1 раз в день ежедневно в течении года
Частота "событий" определяется, сколько раз изменяют данные, а не количеством дней в году.
8 фев 11, 18:41    [10204008]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
Banditos
Member

Откуда:
Сообщений: 88
Elic
И в чём некорректность?

В том, что если периоды будут по одному дню, то таких событий будет всего 365(366) в год.
Если по неделе - то чуть более 52.
Если же по месяцу - то около 12 в год.
Не в жизнь не буду делать чудо-проверку на все-все-все. Достаточно на предварительную при вводе.
Либо менять логику задачи.

Например, никаких периодов. Только однодневная. Уникальная. Без повторов.

ЗЫ. Мне просто сложно представить такую организацию, в которой двум совершенно разным людям понадобится ввести хотя бы два(!) одних и тех же(!) документа в год(!!) - и вводить они это будут в одно и тоже время!!!
8 фев 11, 18:52    [10204055]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
Banditos
Member

Откуда:
Сообщений: 88
-2-
Частота "событий" определяется, сколько раз изменяют данные, а не количеством дней в году.

А это уже откуда такое условие?
В постановке данного условия не было...
8 фев 11, 18:54    [10204063]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
-2-
Member

Откуда:
Сообщений: 15330
Banditos
-2-
Частота "событий" определяется, сколько раз изменяют данные, а не количеством дней в году.

А это уже откуда такое условие?
В постановке данного условия не было...
В постановке нет определения "события". Посему связь конкурентности обновлений с количеством дней в году до меня не доходит.
8 фев 11, 19:16    [10204160]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
Elic
Member

Откуда:
Сообщений: 29978
Banditos
ЗЫ. Мне просто сложно представить такую организацию, в которой двум совершенно разным людям понадобится ввести хотя бы два(!) одних и тех же(!) документа в год(!!) - и вводить они это будут в одно и тоже время!!!
Купи себе книжечку законов Мерфи.
И готовь вазелин :)
8 фев 11, 19:18    [10204173]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение уникальности на период (две даты: с, по)  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Banditos
...
А тебе не приходило в голову, что эти записи могут вестись для 10000 сотрудников?
з.ы. Но тебе спасибо, что вклинился в тему, я пришел к выводу что эта задачка - отличный тест для отсечения воинствующих ламеров с воспаленным юношеским максимализмом.
8 фев 11, 19:24    [10204199]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Oracle Ответить